希尔排序
希尔排序是改进的一种插入排序。
和插入排序有些不同的是,加入了一个gap,这个gap有规律地变化,使得原list分成不同的子序列,分别对子序列进行插入排序。
具体实现如下:
def shell_sort(alist):
'''希尔排序(升序)'''
n = len(alist)
gap = n//2 #python3取整
while gap>=1:
for i in range(gap,n):
#while i > 0 : 这种方式也可以,不过,i-gap会小于0,在python的list里也是适用的,所以我有些点不放心,加了(i-gap)>=0这个条件。
while i > 0 and (i-gap)>=0:
if alist[i]<alist[i-gap]:
alist[i],alist[i-gap] = alist[i-gap],alist[i]
i-=gap
else:
break
gap//=2
#最后以1步长进行排序(此时就是简单的插入排序了)
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,55,20]
print(li)
shell_sort(li)
print(li)
输出:
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
时间复杂度:
- 最优时间复杂度:根据步长序列的不同而不同
- 最坏时间复杂度:O(n2)
- 稳定想:不稳定