图解算法系列(十五):希尔排序法

我们知道当原始记录的键值大部分已经排好顺序的情况下,插入排序法会非常有效率,因为它不需要执行太多的数据搬移操作。“希尔排序法”是D.L.Shell在1959年7月所发明的一种排序法,可以减少插入排序法中数据搬移的次数,以加速排序的进行。排序的原则是将数据区块分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。

下面我们用63,92,27,36,45,71,58,7数列从大到小的排序过程来说明希尔排序法的演算过程,原始数据如图所示:

图解算法系列(十五):希尔排序法_第1张图片
1 将所有数据分成Y:(8 div 2)即Y=4,称为划分数。注意,划分数不一定是2,质数最好,为了方便计算,所以我们习惯选2,因此一开始的间隔设置为 8/2,如图所示
图解算法系列(十五):希尔排序法_第2张图片
2 如此以来可得到四个区块,分别是(63,45),(92,71),(27,58),(36,7),再分别用插入排序法,排序成(45,63),(71,92),(27,58),(7,36)。在整个队列中数据的排列如图所示:
图解算法系列(十五):希尔排序法_第3张图片
3 接着再缩小间隔为(8/2)/2如图
图解算法系列(十五):希尔排序法_第4张图片
4 (45,27,63,58)(71,7,92,36)再分别用插入排序法,得到如图所示结果:
图解算法系列(十五):希尔排序法_第5张图片
5 再以((8/2)/2)/2 的间隔进行插入排序法,也就是每一个元素进行排序,于是最后得到的结果如下图所示:
图解算法系列(十五):希尔排序法_第6张图片

SIZE = 8
def showdata(data):
    for i in range(SIZE):
        print("%3d" % data[i])
    print()

def shell(data,size):
    k=1
    jmp=size/2 # 
    while jmp!=0:
        for i in range(jmp,size): # i 为扫描次数,jmp为设置间隔的位移量
            tmp=data[i] # tmp用来暂存数据
            j=i-jmp # 以j来定位比较的元素
            while tmp= 0:
                data[j+jmp] = data[j]
                j = j - jmp
            data[jmp + j] = tmp

        print("第 %d 次排序过程" % k, end="")
        k+=1
        showdata(data)
        print("-------------------------")
        jmp=jmp/2

def main():
    data = [16,25,39,27,12,8,45,63]
    print("原始数据是:")
    showdata(data)
    print("--------------")
    shell(data,SIZE)

你可能感兴趣的:(数据结构与算法,数据结构与算法)