数据结构与算法(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,如存在版权问题,请及时联系,以免造成非必要纠纷。
标签:排序,插入排序,list,希尔,增长量,数据结构,self 来源: https://blog.csdn.net/weixin_42238563/article/details/117284054