原理思路
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序的实质就是分组插入排序。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
思想的理解可以参考维基百科的这篇文章希尔排序和这篇通俗易懂、层层递进优化的文章白话经典算法系列之三 希尔排序的实现,本文主要是基于后一篇文章的思想进行了python语言的实现。
步骤归纳:
- 选择一个步长序列tk,…,1。
- 按照步长序列个数k,对排序序列进行k趟排序,
- 每趟排序,根据对应的步长ti,将待排序序列分割成ti个子序列,分别对各个子序列进行直接插入排序
代码实现
普通版本
对直观的理解希尔排序有帮助,但不够简洁清晰,可以在去掉一层循环
def hell_sort(collection):
length = len(collection)
gap = length // 2
while gap > 0:
for i in range(0, gap):
j = i + gap
while j < length:
k = j - gap
temp = collection[j]
while k >= 0 and collection[k] > temp:
collection[k + gap] = collection[k]
k -= gap
collection[k + gap] = temp
j += gap
gap //= 2
return collection
if __name__ == '__main__':
collection = list(map(int, input().split()))
print('排序前:', end='')
for i in collection:
print(i, end=' ')
collection = hell_sort(collection)
print('\n排序后:', end='')
for i in collection:
print(i, end=' ')
优化后的版本
def hell_sort_optimization(collection):
length = len(collection)
gap = length // 2
while gap > 0:
j = gap
while j < length:
k = j - gap
temp = collection[j]
while k >= 0 and collection[k] > temp:
collection[k + gap] = collection[k]
k -= gap
collection[k + gap] = temp
j += 1
gap //= 2
return collection
if __name__ == '__main__':
collection = list(map(int, input().split()))
print('排序前:', end='')
for i in collection:
print(i, end=' ')
collection = hell_sort_optimization(collection)
print('\n排序后:', end='')
for i in collection:
print(i, end=' ')
小结
希尔排序的关键在于步长的设定,这方面的文章可以参考前面提到的那篇维基百科的文章。
希尔排序最坏时间复杂度还跟步长序列有关,平均时间复杂度是O(nlogn),空间复杂度为O(1)
项目地址
后续实现的一些算法我都会统一放到GitHub,欢迎小伙伴们一起交流、学习,一起进步!下面是我的GitHub网址。
Github Data_Structure_and_Algorithm
后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技
,扫描下方二维码或者搜索每日学一技
关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!