代码演示
# /usr/bin/python
# -*- coding:utf-8 -*-
sample = [3, 7, 15, 6, 4, 2, 8]
L = len(sample)
while True:
L = L/2
k = 0
#将序列分成L个子序列
for k in range(0, L):
i = k + L
while i < len(sample):
j = i
while j > k:
if sample[j] < sample[j - L]:
Temp = sample[j - 1]
sample[j - 1] = sample[j]
sample[j] = Temp
else:
break
j = j - L
i = i + L
if L == 1:
break
代码解释:
最外层for循环表示序列被分为L个子序列,每个子序列都需要进行单独排序;
从第14行while开始,内部都是插入排序内容;
第14行while表示每个子序列有m个元素,根据插入排序算法:
第一次,第二个元素先比较
第二次,第三个元素和前面元素比较
…
…
第m-1次,第m个元素和前面元素比较
如代码,L = L/2,每个子序列有2个元素,第二元素比较,i 第二次累加,即跳出while;L = L/4,每个子序列有4个元素,后面3个元素比较后,i 第四次累加,即跳出循环
while i < len(sample):
...
...
i = i + L
第二个while循环,i 不断累加,将每次累加后的初始值赋给 j ,第一次累加,第二个元素和前面元素比较;第二次累加,第三个元素和前面元素比较,j 最多累减两次,刚好第三个元素最多比较两次;第三次累加,第四个元素和前面元素比较。。。
j = i
while j > k:
if sample[j] < sample[j - L]:
Temp = sample[j - 1]
sample[j - 1] = sample[j]
sample[j] = Temp
else:
break
j = j - L
i = i + L