希尔排序是一种特殊的插入排序,是直接插入排序的一个进化版。
这里引入一个增量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)
那么希尔排序的复杂度是多少呢,欢迎大家在评论区留言交流~
(如有错误,欢迎指出)