第一次接触到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,因此没有进入内层循环,序列没有打印出来。