希尔排序(Shell sort)
算法描述:
Step1:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序。
Step2:依次缩减增量再进行排序。
Step3:待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
算法结束。
因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序相较于前几种方法有较大的提升。
PS:学数据结构和算法最好的方法就是图解,能看懂图,就别看繁琐的文字描述,看不懂图,再结合文字描述看懂,算法也就学会了
#shellsort
def shellsort(arr):
step = len(arr) // 2
while step > 0:
for i in range(step,len(arr)):
while i >= step and arr[i - step] > arr[i]:
arr[i] ,arr[i - step] = arr[i - step] ,arr[i]
i -= step
step //= 2
return arr
if __name__ == '__main__':
test = [49, 38, 65, 97, 76, 13, 27, 49]
print(shellsort(test))
注:这种写法插入排序时使用了交换法
希尔算法的关键就是掌握缩小增量序列,即{n//2,(n//2)//2...1}(希尔增量),其平均时间复杂度为O(nlogn),最坏时间复杂度依然为O(n^2),一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n^1.5)。
稳定性:不稳定
参考文献:
[1] http://www.cnblogs.com/chengxiao/p/6104371.html
[2] https://jingyan.baidu.com/album/db55b609f856604ba30a2f18.html?picindex=1