def shellsort(A):
LEN =len(A)
gap = LEN // 2while gap>0:for i inrange(gap,LEN):
j = i
while A[j]< A[j-gap]:
A[j], A[j-gap]= A[j-gap],A[j]
j -= gap
gap = gap // 2returnAif __name__ =='__main__':
A =[2,3,4,6,8,1,9,5]print(shellsort(A))
分析:
从其他博主那里盗来一张图,方便解释
首先你要关注为什么 gap 从 LEN // 2 做为初始值,然后每次 gap 都会减小,这究竟是为什么?
当 gap = LEN // 2 的时候,如果 LEN = 10, gap = 5,从上面的图可以清晰地看见,整个序列被分成了 5 组,你可以粗略地理解 gap 的值等于把整个序列分组的个数。第二次 gap 变成了 2,整个序列又被分成了两组。可为什么 gap 要从大变到小呢?
因为 gap 越大,组数越多,当整个序列开始的时候,是很凌乱的,这个时候分的组数越多,整个组中的值的数量就越少,那么在同一个组的数据之间进行插入排序的难度就会越小,所以当我们 gap = 5 的时候序列进行插入排序的难度是最小的,因为每一个组内只有两个值进行排序。而后随着序列逐渐变得有序,我们就可以减小 gap 从而使每个组的成员个数变多,来进行插入排序,这样会更有效率。
python 代码def shellsort(A): LEN = len(A) gap = LEN // 2 while gap>0: for i in range(gap,LEN): j = i while A[j] < A[j-gap]: A[j], A[j-gap] = A[j-gap],A[j] j -= gap gap