排序-希尔

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,
也称为缩小增量排序。
核心思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,
算法便终止。

简单来说:原来插入排序是需要每插入一个新的值,就需要与前面的每个值进行比较,
现在是先有个gap,就是所谓的步长,先让这个gap步长的一组数执行插入排序,这样
一组gap的数排序好后,再把gap缩小,再进行插入排序,直至gap=1位置,再执行
插入排序,这样经过前面几次gap后,列表中的数据相对有序了,最后一次进行插入
排序的时候,需要移动的次数就会变少,从而提高排序效率。

Python算法实现:
def shellSort(data):
    #步长,循环每次循环除以2,直到1停止
    gap = int(len(data)/2)
    while gap > 0:
        for i in range(gap,len(data),1):
            j = 0
            j = i - gap
            temp = data[i]
            while (j >= 0 ):
                # 这样写代码有问题,只是data[j]与data[i]位置的值做了比较,这样是不对的,因为一旦data[i]的值发生改变了
                # 则修改了原来需要比较的值,比如:3,6,1,那么我们是需要用1不断与前面的,3,6来进行比较,
                # 应该拿data[i]与之前距离是gap的所有的值都比较,下面注释的代码是错误的写法,记录一下
                #if (data[j] > data[i]):
                    #data[j], data[i] = data[i], data[j]
                    #j = j - gap
                if (data[j] > temp):
                    data[j + gap],data[j] = data[j],temp
                j = j - gap

        print("gap=%d"%gap, end="")
        print(data)
        #减小增量
        gap = int(gap/2)

def main():
    data = list(map(int,input("请输入需要排序的列表,逗号间隔:").split(",")))
    #1,4,2,7,9,8,3,6
    #9,1,2,5,7,4,8,6,3,5
    #3,6,1
    shellSort(data)
    print("希尔排序结果为:", end="")
    print(data)
if __name__ == "__main__":
    main()

 

 
posted @ 2020-04-08 21:42  StudyNLP  阅读(165)  评论(0编辑  收藏  举报