希尔排序举例:
待排序数列为:
7 | 10 | 0 | 12 | 1 | 5 | 3 | 11 | 4 | 9 | 6 | 8 | 2 | 13 |
定义增量序列DK>DK-1>...>D1=1,这里定义为[ 5, 3, 1 ]
5-间隔排序:
5 | 6 | 7 | |||||||||||
5 | 3 | 6 | 8 | 7 | 10 | ||||||||
5 | 3 | 0 | 6 | 8 | 2 | 7 | 10 | 11 | |||||
5 | 3 | 0 | 4 | 6 | 8 | 2 | 12 | 7 | 10 | 11 | 13 | ||
5 | 3 | 0 | 4 | 1 | 6 | 8 | 2 | 12 | 9 | 7 | 10 | 11 | 13 |
3-间隔排序:
4 | 5 | 8 | 9 | 11 | |||||||||
4 | 1 | 5 | 2 | 8 | 3 | 9 | 7 | 11 | 13 | ||||
4 | 1 | 0 | 5 | 2 | 6 | 8 | 3 | 10 | 9 | 7 | 12 | 11 | 13 |
3-间隔排序后仍是5-间隔有序的。实际上Dk间隔在执行Dk-1间隔的排序后,仍是Dk间隔有序的。
1-间隔排序:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
print("希尔排序")
c=[7,10,0,12,1,5,3,11,4,9,6,8,2,13]
def Shell_sort(c):
N = len(c)
for D in [5,3,1]:#[5,3,1]是一个增量序列,数据量少时可以自己定义,尽量使元素间互质;数据量多时可以参考Sedgewick增量序列等。
for p in range(D,N):
Tmp=c[p]
i=p
while i>=D and c[i-D]>Tmp:
c[i]=c[i-D]
i=i-D
c[i]=Tmp
return c
Shell_sort(c)