• 排序-希尔


    希尔排序是希尔(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()
     
  • 相关阅读:
    简单Linux C线程池2
    简单xmlwriter类
    给10^7个有重复的整数排序(败者树)
    给10^7个无重复的整数排序
    将一个4字节整数的二进制表示中的001替换为011
    腾讯社招面试经历
    小闹钟 免费 开源 C# .net framework4
    国内外PHP开源建站程序
    用 .NET Memory Profiler 跟踪.net 应用内存使用情况基本应用篇 (转载)
    c# 语言 winform 项目中 control.parent 的使用 (原创)
  • 原文地址:https://www.cnblogs.com/an-wl/p/12663045.html
Copyright © 2020-2023  润新知