shell排序在python中的实现

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

你可能感兴趣的:(python,python,shell)