标签:bsp 子序列 png inf 排序 插入排序 img http for循环
思路:[256,35,96,2,34,65,732,653,20]
对于一个数组,我们不再像插入排序那个把它当成两个部分,
而是引入一个gap,假设gap=4,就会有
256 34 20
35 65
96 732
2 653
分成了上面所示的4个子序列
对于这些子序列进行插入排序,即
20 34 256
35 65
96 732
2 653
这时候数组就为[20,35,96,2,34,65,732,653,256]
我们将gap减少,让gap=3
20 2 732
35 34 653
96 65 256
再分别进行插入排序
2 20 732
34 35 653
65 96 256
数组就为[2,34,65,20,35,96,732,653,256]
按照上述做法值到gap=1,这时候就是插入排序
我们先写出内部比较部分:这时候我们考虑最后一个元素它的第一次排序情况:
#codin: utf-8 def shell_sort(alist): n=len(alist) gap=4 i=n-1 if alist[i]<alist[i-gap]: alist[i],alist[i-gap]=alist[i-gap],alist[i] a=[256,35,96,2,34,65,732,653,20] print(a) shell_sort(a) print(a)
结果:
接下来我们整体考虑,上面这个判断情况应该是当i>0进可以继续进行下去,所以给它接上一个while循环
之后,我们将进一步考虑i的取值问题,我们发现i在跟i-gap位置上的元素进行比较,可以想到i<gap的时候,没办法比较,所以i应该选择从gap位置开始,不断添加,一直到最后一个元素位置为止
所以引入一个for循环,range(gap,n),其中有i=gap
这时候我们进完成了不断插入排序的过程
再考虑什么时候结束循环,由上面思路可知,gap最后应该为1,变成插入排序,所以再整体引入循环while gap>0
gap的取值问题:我们可以让它不断除以2,缩小范围,来控制整体循环次数,代码如下:
#codin: utf-8 def shell_sort(alist): n=len(alist) 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-1 else: break gap//=2 a=[256,35,96,2,34,65,732,653,20] print(a) shell_sort(a) print(a)
结果:
标签:bsp 子序列 png inf 排序 插入排序 img http for循环
原文地址:https://www.cnblogs.com/cong3Z/p/12904105.html