選擇排序,顧名思義是一種“選擇”,每次選擇最小(大)的數與首位數交換
接下來從第二個數開始對後面的序列繼續進行上一步操作,每次都選擇最小的數,與之交換
循環操作直到剩下一個數的時候爲結束
相關的C語言,java代碼相信大家都能找到
今天,我們通過8086彙編語言,看一下這個排序算法
DATAS SEGMENT
ary dw 1,44,3,42,5,52,7,43,9,10
arysize dw 20
position dw 0
table dw 3 dup(?)
temp dw 0
DATAS ENDS
STACKS SEGMENT
dw 20 dup(0)
STACKS ENDS
CODES SEGMENT
START:
main proc far
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MOV AX,DATAS
MOV DS,AX
mov table,offset ary
mov table+2,offset arysize
mov table+4,offset position
mov bx,offset table
call com_pary
MOV AH,4CH
INT 21H
ret
main endp
com_pary proc near
push ax
push cx
push si
push di
mov si,[bx];數組位置
mov di,[bx+2];數組的length
mov cx,[di];用cx記錄循環次數
mov di,[bx+4];標誌最小值的位置
loop1:
push cx
mov ax,arysize
sub ax,cx;讓ax=i
mov bp,ax;bp爲光標,指向哪個就對哪個操作
mov bx,ds:[si+bp];bx記錄最小值
mov di,bp;di記錄最小值的位置
add bp,2;對下一個數操作
loop2:
cmp ds:[si+bp],bx
jnb continue;如果bx較小則不用變
mov bx,ds:[si+bp];如果bx較大則更新bx爲新的最小值
mov di,bp;最小值的位置隨之變化
continue:
add bp,2
cmp bp,arysize
jbe loop2
mov bp,ax;bp爲光標,指向哪個就對哪個操作
mov ax,ds:[si+bp]
mov dx,bx;讓dx記錄最小值
mov bx,di;讓bx記錄最小值的位置
mov ds:[si+bx],ax;最小值與第一個值交換位置
mov ds:[si+bp],dx
pop cx
sub cx,2
cmp cx,0
ja loop1
pop di
pop si
pop cx
pop ax
ret
com_pary endp
CODES ENDS
END START
(如有錯誤,歡迎指出)