数据结构与算法(4)——希尔排序

1 算法原理

希尔排序是插入排序的一种,又称为“缩小增量排序”,是插入排序的一种高效改进版本。插入排序

1.1 希尔排序原理

  • 选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;
  • 对分好组的每一组数据完成插入排序;
  • 减小增长量,最小减为1,重复第二步骤。
    在这里插入图片描述
    增长量h的取值存在一定的规则:
  • 初始:h=1,while h<len(list)/2 进行h=2*h+1 (这一步是设置初始h,即第一趟排序的h值)
  • h的减小规则为:h=h/2,直到h=1
    以图为例:
    第一步选取增常量h=5,对原始数据进行分组。分组后的结果为[9,4],[1,8],。。。,[7,5],并对每组数据进行排序。
    随后逐步减少增长量h直到h=1。

1.2 Python代码

import copy
class Shell(object):
    def __init__(self,A):
        self.list = copy.deepcopy(A)
        self.h=1
        while self.h<int(len(self.list)/2):
            self.h = int(self.h*2)+1
    def sort(self):
        while self.h>=1:
            #排序
            #1.找到要插入的元素
            for i in range(self.h,len(self.list)):
                #2.把待插入元素插入到有序数列中
                j = i
                while j>=self.h:
                    #待插入的元素是list[j],比较list[j]与list[j-h]
                    if self.list[j-self.h]>self.list[j]:
                        self.list[j - self.h], self.list[j]= self.list[j], self.list[j - self.h]
                    else:
                        break
                    j -= self.h
            #h减小
            self.h=int(self.h/2)
        return self.list

测试结果:

排序前数据: [3, 3, 6, 8, 2, 4, 6, 2, 7, 9, 4, 3]
排序后数据: [2, 2, 3, 3, 3, 4, 4, 6, 6, 7, 8, 9]

1.3 时间复杂度分析

太复杂了,用事后计算法对多个算法进行比较,使用time模块进行计时就可以了。比起插入排序还是快了很多很多了(快多少可以自己去试:Test_list = np.arange(1,100000)[::-1])。

结尾

结尾
如果有文字错误、描述错误等,希望各位能私聊或留言指出。
下一篇内容将介绍高级排序(快速排序)并附带相应的python代码。
上一章节:数据结构与算法(3)——归并排序
学习内容来自B站:https://www.bilibili.com/video/BV1Cz411B7qd,如存在版权问题,请及时联系,以免造成非必要纠纷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值