Python实现希尔排序(已编程实现)

观察一下”插入排序“:其实不难发现她有个缺点:

如果当数据是”5, 4, 3, 2, 1“的时候,此时我们将“无序块”中的记录插入到“有序块”时,估计俺们要崩盘,

每次插入都要移动位置,此时插入排序的效率可想而知。

shell根据这个弱点进行了算法改进,融入了一种叫做“缩小增量排序法”的思想,其实也蛮简单的,不过有点注意的就是:

增量不是乱取,而是有规律可循的。

Python实现希尔排序(已编程实现)

希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。

首先要明确一下增量的取法(这里图片是copy别人博客的,增量是奇数,我下面的编程用的是偶数):

      第一次增量的取法为: d=count/2;

      第二次增量的取法为:  d=(count/2)/2;

      最后一直到: d=1;

好,注意看图了,第一趟的增量d1=5, 将10个待排记录分为5个子序列,分别进行直接插入排序,结果为(13, 27, 49, 55, 04, 49, 38, 65, 97, 76)

第二趟的增量d2=3, 将10个待排记录分为3个子序列,分别进行直接插入排序,结果为(13, 04, 49, 38, 27, 49, 55, 65, 97, 76)

第三趟的增量d3=1, 对整个序列进行直接插入排序,最后结果为(04, 13, 27, 38, 49, 49, 55, 65, 76, 97)

重点来了。当增量减小到1时,此时序列已基本有序,希尔排序的最后一趟就是接近最好情况的直接插入排序。可将前面各趟的"宏观"调整看成是最后一趟的预处理,比只做一次直接插入排序效率更高。

本人是学Python的,今天用python实现了希尔排序。

1 def ShellInsetSort(array, len_array, dk): # 直接插入排序 2 for i in range(dk, len_array): # 从下标为dk的数进行插入排序 3 position = i 4 current_val = array[position] # 要插入的数 5 6 index = i 7 j = int(index / dk) # index与dk的商 8 index = index - j * dk 9 10 # while True: # 找到第一个的下标,在增量为dk中,第一个的下标index必然 0<=index<dk 11 # index = index - dk 12 # if 0<=index and index <dk: 13 # break 14 15 16 # position>index,要插入的数的下标必须得大于第一个下标 17 while position > index and current_val < array[position-dk]: 18 array[position] = array[position-dk] # 往后移动 19 position = position-dk 20 else: 21 array[position] = current_val 22 23 24 25 def ShellSort(array, len_array): # 希尔排序 26 dk = int(len_array/2) # 增量 27 while(dk >= 1): 28 ShellInsetSort(array, len_array, dk) 29 print(">>:",array) 30 dk = int(dk/2) 31 32 if __name__ == "__main__": 33 array = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] 34 print(">:", array) 35 ShellSort(array, len(array))

输出:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6ca3ae7cacfd846524dbfc8b243b9b3b.html