【8086彙編】基礎排序之基數排序

基數排序也叫做“桶子法”,通過數的部分內容,將要排序的數分配到一個個“桶”中,再進行新的串聯。最高位有幾位,就循環幾次,藉此達到排序的作用。

簡單來舉個例子:一個最高位爲3爲的數序列,把數按照個位順序組成一個新的序列,再把數按照十位順序組成一個新的序列,最後再把數按照百位順序組成一個新的序列,即完成排序。

原理很多地方都有,不再贅述

下面我們照常看一下基數排序的彙編代碼


;這個代碼只符合對1000以下的10個三位數排序
DATAS SEGMENT
    temp db 100 dup(0)
    data db 73, 22, 56, 14, 24, 65, 39, 81, 33, 100
    order db 10 dup(0)
    ten db 10
DATAS ENDS

STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS

CODES SEGMENT
    
START:
main proc far
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
    MOV AX,DATAS
    MOV DS,AX
    
    mov cx,3;因爲最多隻有三位數
    mov dl,1
    mov dh,0;下面用除以dl的方式分別去到個十百的位數
    mov di,0;
loop1:
	push cx
	
    mov bp,0;bp=i=0
getNumber:;第一個循環用於分桶
	mov al,ds:data[bp]
	mov ah,0
	div dl
	mov ah,0
	div ten
	mov al,ah
	mov ah,0
	mov si,ax;用si表示lsd(詳情去百度基數排序看解釋)
	
	mov bl,ds:order[si]
	mov bh,0
	add ds:order[si],1
	mov ax,si
	mul ten
	mov si,ax
	mov al,ds:data[bp]
	mov ds:temp[si][bx],al

	
	inc bp
	cmp bp,10
	jb getNumber
    
    mov bp,0
zuhe:;第二個循環把分好桶的數字重新串聯起來
	mov al,ds:order[bp]
	cmp al,0
	jz tonext
	
	mov bx,0
paixu:
	mov ax,bp
	mul ten
	mov si,ax
	mov al,ds:temp[si][bx]
	mov ds:data[di],al
	inc di
	
	inc bx
	cmp bl,ds:order[bp]
	jb paixu
	
	mov ds:order[bp],0
tonext:	
	inc bp
	cmp bp,10
	jb zuhe
    
    mov ax,dx
    mul ten
    mov dx,ax;用於求下一位數
    mov di,0
    pop cx
    loop loop1
    
    MOV AH,4CH
    INT 21H
main endp

CODES ENDS
    END START



另外,基數排序是一種不穩定的排序算法,它的複雜度是O (nlog(r) m)

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