python 希尔排序

希尔排序,又称缩小增量排序,其实就是改进版的插入排序

当待排序列基本有序的情况下,插入算法的效率非常高,那么希尔排序就是利用这个特点对插入算法进行了改造升级

希尔排序的关键是对待排序进行分组,这个分组并不是真的对序列进行了拆分,而仅仅是虚拟的分组,增量是分组时所使用的步长

如:

#待排序数组
4,1,67,34,12,35,14,8,6,19

第一轮希尔排序

虚拟分组,组数为(n/2),增量是(n/2),即是从第0个元素开始,每个元素和自己距离n/2(n是数组的长度)的元素分为一组

4   35
1   14
67  8
34  6
12  19

然后对各组内的元素进行插值排序,得到

4, 1, 8, 6, 12, 35, 14, 67, 34, 19

 

第二轮希尔排序

上一轮排序,组数n/2,这次是(n/2)/2,增量是(n/2)/2

4 8 12 14 34
1 6 35 67 19

分别插值排序后
4 8 12 14 34
1 6 19 35 67

排序后的结果为:

4, 1, 8, 6, 12, 19, 14, 35, 34, 67

 

代码如下:

lst = [4,1,67,34,12,35,14,8,6,19]
length = len(lst)
step = length//2

while step > 0:

    for i in range(step):
        # 插入排序
        for j in range(i+step, length, step):
            if lst[j] < lst[j-step]:
                tmp = lst[j]
                k = j-step

                while k >= 0 and lst[k] > tmp:
                    lst[k+step] = lst[k]
                    k -= step

                lst[k+step] = tmp
    step //= 2 #缩小增量

print lst

 

posted on 2020-08-06 16:57  小小喽啰  阅读(166)  评论(0编辑  收藏  举报