排序算法之希尔排序
整理自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)
输出结果: