【8086彙編】基礎排序之選擇排序

選擇排序顧名思義是一種“選擇”,每次選擇最小(大)的數與首位數交換

接下來從第二個數開始對後面的序列繼續進行上一步操作,每次都選擇最小的數,與之交換

循環操作直到剩下一個數的時候爲結束


相關的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


與冒泡排序一樣,這也是一個複雜度爲O(n^2)的排序算法,可以用來處理規模較小的數據


(如有錯誤,歡迎指出)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章