希爾排序是一種特殊的插入排序,是直接插入排序的一個進化版。
這裏引入一個增量d的概念,把整個數據分成d份進行排序,然後不斷縮小d,最後當d減至1時,數據組成一份,完成排序。
詳細讀者可以自己去查一下資料,原理網上都有
下面我們照常看一下希爾排序的彙編代碼
DATAS SEGMENT
ary db 2,24,16,21,36,49,14,16,12,33
count db 10
DATAS ENDS
STACKS SEGMENT
dw 10 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov al,count
mov ah,0;ax記錄希爾排序中的d
mov cl,2
div cl
mov ah,0
loop1:
push ax
mov bx,ax;bx記錄比較次數
mov di,ax
loop2:
mov dl,ds:ary[bx]
mov ax,bx
sub ax,di
mov bp,ax
cmp dl,ds:ary[bp]
jnb jmploop2
mov cl,dl;cx記錄當前值,相當於N[0]
mov ch,0
mov bp,ax
loop3:
cmp bp,0
jb tochange
cmp cl,ds:ary[bp]
jnb tochange
mov al,ds:ary[bp]
mov ds:ary[di+bp],al
sub bp,di
jmp loop3
tochange:
mov ds:ary[bp+di],cl
jmploop2:
inc bx
cmp bl,count
jb loop2
pop ax
mov cl,2
div cl
mov ah,0
cmp ax,0
ja loop1
MOV AH,4CH
INT 21H
CODES ENDS
END START
希爾排序是一種非穩定性算法,因爲相同的兩個數經排序之後,他們的次序可能會發生改變
開頭說到希爾排序是直接插入排序的一種進化版,直接插入排序的複雜度是O(n^2)
那麼希爾排序的複雜度是多少呢,歡迎大家在評論區留言交流~
(如有錯誤,歡迎指出)