第一次接触到shell排序,算法比较有意思,简单记录一下。
它的思想是先比较序列中距离比较远的元素,这样可以快速减少大量的无序情况,从而减轻后续操作。在python中的代码如下:
#coding: utf-8
def shell_sort(A, n):
m=0
k=0
gap=n
while gap>1:
gap/=2
print '\n'
print 'gap=',gap
for i in range(gap,n):
j=i-gap
m+=1
print 'j=',j
print '中间层第%d次循环'%m
while (j>=0 and A[j]>A[j+gap]):
A[j],A[j+gap]=A[j+gap],A[j]
j-=gap
k+=1
print '内层第%d次循环:'%k,A
return A
循环一共有三层,为了能够明白循环的细节(事实上并不需要知道),我加了几个计数器来记录它的运行过程。假设有一个无序序列 [3,7,2,5,1,4,6] ,运行结果如下:
>>> shell_sort([3,7,2,5,1,4,6], 7)gap= 3
j= 0
第二层第1次循环
j= 1
第二层第2次循环
内层第1次循环: [3, 1, 2, 5, 7, 4, 6]
j= 2
第二层第3次循环
j= 3
第二层第4次循环
gap= 1
j= 0
第二层第5次循环
内层第2次循环: [1, 3, 2, 5, 7, 4, 6]
j= 1
第二层第6次循环
内层第3次循环: [1, 2, 3, 5, 7, 4, 6]
j= 2
第二层第7次循环
j= 3
第二层第8次循环
j= 4
第二层第9次循环
内层第4次循环: [1, 2, 3, 5, 4, 7, 6]
内层第5次循环: [1, 2, 3, 4, 5, 7, 6]
j= 5
第二层第10次循环
内层第6次循环: [1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] 第二层第一次循环时,由于3不大于5,因此没有进入内层循环,序列没有打印出来。