快速排序
emu8086可成功執行
data segment
buff dw 0000h, 0001h,0002h,0004h,0003h,0005h,0007h,0006h
count equ $*buff
data ends
stack segment papa stack 'stack'
dw 100 dup(?)
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax, data
mov ds, ax
mov si, 0
mov di, 98 ;si, di 設置初始值
call quicksort ;調用快排
mov ax, 4c00h
int 21h
quicksort proc near
push si
push di ;保存原有的si,di
call part ;調用part函數
pop di
pop si
push di
push ax ;part函數中,ax用來保存新的si
cmp ax,0000h
jbe x1
sub ax,2 ;ax作爲左邊部分的di
mov di,ax
cmp si,di
jae x1
call quicksort ;如果左半部分的si=<di,左半部分進行遞歸
x1:nop
pop ax ;ax作爲右半部分的si
add ax,2
mov si,ax
pop di
cmp si,di
jae x2
call quicksort ;如果右半部分的si=<di,右半部分進行遞歸
x2:nop
ret
quicksort endp
part proc near ;part函數,將當前si所指的關鍵字插入到正確位置
mov bx, word ptr buff[si]
l1: ;di所指的數值與si比較,如果所指數值小於si數值,交換,否則di-2
cmp si, di ;如果si=di,返回
jae l
mov ax, word ptr buff[di]
cmp ax, bx
jae done1
mov ax, word ptr buff[si]
xchg ax, word ptr buff[di]
mov word ptr buff[si], ax
jmp l2
done1: sub di,2
jmp l1
l2: cmp si,di ;si所指的數值與di比較,如果所指數值大於di數值,交換,否則si+2
jae l
mov ax, word ptr buff[si]
cmp bx, ax
jae done2
mov ax, word ptr buff[si]
xchg ax, word ptr buff[di]
mov word ptr buff[si], ax
jmp l1
done2: add si,2
jmp l2
l: mov ax,si ;保存此時的si
ret
part endp
code ends
end start