Python 实现 希尔排序, 希尔排序其实 就是 插入排序的改进版吧,希尔排序的步长选择都是从d=len/2开始,每次再减半,直到最后为1,当变为1的时候 ,可以认为就是简单的插入排序。这种缩小步长的好处,非常简单,弥补了插入排序的缺点,尽可能减少数字的移动次数。希尔思想是这样 局部看起来有序,然后局部的局部在有序,直到 步长为1,就保证了不会出现,待排序列都是逆序的情况。 这种想法非常高明,佩服希尔。

 

希尔排序按其设计者 希尔(Donald Shell)的名字命名,该算法由1959年公布。一些老版本教科书和参考手册把该算法命名为Shell-Metzner,即包含Marlene Metzner Norton的名字,但是根据Metzner本人的说法,“我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。”

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。

但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。



# coding=utf-8
'''
@author:chang

shell_sort  排序
2017-10-18 星期三

'''


def group_sort(array,length,d ,x):
    '''
    *group 内排序
    *参数说明:
    *array - - 待排序的数组
    *len  - - 数组的长度
    *d     组的步长
    *x     组的起始位置
    '''
    for i in range(x+d,length,d):
        k = i
        temp = array[k]
        for j in range(i-d,-1,-d):
            if array[j] > temp:
                array[j+d]=array[j]
                k =j
            else:
                break
        array[k] =temp


def shell_sort(array,length):
    gap = length//2
    while gap >0:
        for i in  range(0,gap,1):
            # 共gap个组,对每一组都执行直接插入排序
            group_sort(array,length,gap,i)
        gap = gap//2

    return  array

if __name__ == '__main__':

    mylist=[1,34,6,21,98,31,7,4,36,16,47,67,37,25,2]
    length= len(mylist)

    print(shell_sort(mylist,length))


下面看看 结果:




总结: 本文主要实现用Python 实现希尔排序。

参考链接:

希尔排序c语言实现



分享快乐,留住感动。       2017年 10月 18日 星期三 16:28:34   ---biaoge