希尔排序:
以下为举例说明希尔排序用法
54,26, 93,17,77,31,44,55,20
取gap为4:从54开始作为第一个,加4取出第二个
54 77 20 20 54 77
26 31 26 31
93 44 44 93
17 55 17 55
把每一行看作一个独立新序列,每一行的序列进行插入排序,插入排序结束后,在以原间距位置组合成一个序列
20,26,44,17,54,31,93,55,77
再缩小gap,gap=2,以20为开始,加2,取出第二个,后面依次类推
20 44 54 93 77 20 44 54 77 93
26 17 31 55 17 26 31 55
把每一行看作一个独立新序列,每一行的序列进行插入排序,插入排序结束后,在以原间距位置组合成一个序列
20 17 44 26 54 31 77 55 93
再次缩小,gap=1,以20为开始,加1,取出第二个,后面依次类推(因为间隔为一相当于为一个序列,直接进行插入排序)
17 20 26 31 44 54 55 77 93
python实现希尔排序的代码如下:
# coding:utf-8
def shell_sort(alist):
"""希尔排序"""
n = len(alist)
#python2中去整数除法用/,python3中去整数除法用/ /
gap = n//2
while gap > 0:
for j in range(gap,n):
i = j
while i > 0:
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i = i - gap
else:
break
gap = gap//2
if __name__ =="__main__":
li = [54,26,93,17,77,31,44,55,20]
print(li)
shell_sort(li)
print(li)
希尔排序的最优时间复杂度:不确定
最坏时间复杂度:O(n的2次方)