Python实现十大经典排序 II
摘要: 本博客主要介绍希尔排序、堆排序、桶排序、基数排序、计数排序等五种排序方法思想及Python实现。
版本号 | 更新时间 | 作者 | 更新章节 | 更新概述 |
V1.0 | 2019-02-13 | 蒙蕤 | 1 | 算法描述、Python实现 |
V1.1 | 代码注释 |
1、希尔排序
希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个记录恰被分成一组,算法终止。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
举例说明该排序算法,图片来自百度百科:
https://baike.baidu.com/item/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F/3229428?fr=aladdin
希尔排序不需要额外的空间,是基于插入排序的一种算法, 时间复杂度与增量序列的选取有关,尽量让增量间互质。
希尔排序Python实现:
def is_prime(number):
if number <= 1:
return False
for fact in range(2, int(number ** 0.5)):
if not number % fact:
return False
return True
def get_increment(inc):
if inc == 1:
return 0
if inc == 2:
return 1
holder = inc // 2
for m_inc in range(holder, 2, -1):
if is_prime(m_inc):
return m_inc
return 2
def shell_sort(my_list):
inc = n = len(my_list)
while True:
inc = get_increment(inc)
if not inc:
break
for i in range(inc):
for j in range(i, n - inc, inc):
item_to_insert = j
for t in range(j + inc, n, inc)
if my_list[t] < my_list[item_to_insert]:
my_list[item_to_insert], my_list[t] = \
my_list[t], my_list[item_to_insert]
2、堆排序
---------------------
作者:蒙蕤
来源:CSDN
原文:https://blog.csdn.net/Mengrui_1991/article/details/86512437
版权声明:本文为博主原创文章,转载请附上博文链接!