dangdangA

导航

排序算法之希尔排序

整理自B站真情的可贵课程内容~

1.希尔排序定义:

    是直接插入排序的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分为一组,算法便终止。希尔排序又称“缩小增量排序”,即每趟只对相同增量距离的关键字进行比较,这与关键字序列初始有序或无序无关。

2.时间复杂度:

      最优时间复杂度:根据步长来定

      最差时间复杂度:O(n2)

3.稳定性:不稳定

4.Python代码

此处gap的选取采用半折的方法,仅仅是熟悉希尔排序,具体问题中gap的选取很复杂,依据具体问题来定。

 1 #coding:utf-8
 2 #希尔排序
 3 def shell_sort(alist):
 4     """插入排序"""
 5     n = len(alist)
 6     gap = n // 2
 7     #gap变化到0之前,插入算法执行的次数
 8     while gap > 0:  #gap最终降为1时即普通的插入排序
 9         #插入算法,与普通的插入算法的区别就是gap步长
10         for j in range(gap,n):
11             i = j
12             while i > 0:
13                 if alist[i] < alist[i - gap]:
14                     alist[i],alist[i-gap] = alist[i-gap],alist[i]
15                     i -= gap
16                 else:
17                     break
18         #缩短gap步长
19         gap //= 2
20 
21 if __name__ == "__main__":
22     alist = [93, 54, 77, 31, 44, 55, 226]
23     print("希尔排序之前的原始列表:")
24     print(alist)
25     shell_sort(alist)
26     print("希尔排序之后的列表:")
27     print(alist)

输出结果:

 

posted on 2020-02-19 19:16  dangdangA  阅读(274)  评论(0编辑  收藏  举报