希尔排序
希尔排序
描述:
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。是将整个序列分割成若干小的子序列分别进行插入排序
原理:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
时间复杂度:
最优时间复杂度:根据步长序列的不同而不同
最坏时间复杂度:O(n2)
稳定性:
不稳定
由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
希尔排序演示:
代码实现:
简洁版:
def Shell_sort(L): n = len(L) step = len(L) // 2 while step > 0: for i in range(step, n): while i >= step and L[i] < L[i - step]: L[i], L[i - step] = L[i - step], L[i] i -= step step //= 2 return L
注释版:
def shell_sort(L): n = len(L) step = len(L) // 2 while step > 0: for i in range(step, n): while i >= step and L[i] < L[i - step]: L[i], L[i - step] = L[i - step], L[i] i -= step step //= 2 return L # 最一层循环控制所有步长的情况, 如果步长大于0, 即: 步长大于等于1, 则执行循环体 # 第二层循环控制一个步长的情况, 一个步长分N多个序列 # 第三层循环控制一个序列, 在这个序列内, 执行直接插入排序的代码, 如果当前元素小于前驱元素, 则交换位置, 然后前移, 再次比较 # 执行完一个步长后, 步长减半继续执行, 直到步长大于等于1 if __name__ == "__main__": l = list(i for i in range(0, 100000)) print("洗牌之前的列表:" + str(l)) random.shuffle(l) print("洗牌之后的列表:" + str(l)) print("希尔排序之后:" + str(shell_sort(l)))