目录
前言
你好,我是Dr.叶子,用心写最优美的博客,弹最好听的钢琴!
背景
- 最近整理知识点,发现在数据结构方面不是很扎实,所以自己重新学习排序算法,结合网上资料,自己深度理解,再利用Python3来实现,与大家分享,也提升自己的知识水平!
- 本文包含冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排序、桶排序、基数排序,每一段代码都有详细的注释。
排序分类
一、冒泡排序(交换类)
1. 算法步骤:
① 从头开始,依次两两比较待排序列表中的相邻元素,若前者比后者大,则交换位置,直到最大的元素排在最后位置,一轮排序完成,重复本步骤;
② 每一轮排序完成,将产生 1 个最大元素排在最后,该元素不再参与下一轮比较;
③ 待排序列表的长度每轮 -1,即去掉最后一个已经完成排序的元素;
2. 演示:
3. 代码实现:
def bubble_sort(List):
# 1.原列表长度
n = len(List)
# 2.依次两两比较
for i in range(1, n):
for j in range(0, n - i):
# 3.前者比后者大,则交换位置
if List[j] > List[j + 1]:
List[j], List[j + 1] = List[j + 1], List[j]
return List
if __name__ == '__main__':
List = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
result = bubble_sort(List)
print(result)
二、快速排序(交换类)
1. 算法步骤:
① 从原列表中选一个元素,作为"基准值";
② 以这个"基准值"为原则,划分成左、右 2 个子列表,大于“基准值”的元素放右列表,小于“基准值”的元素放左列表(等于的可左可右);
③ 重复步骤 ① ,继续分别在 2 个子列表中,各自选取"基准值"来划分出新的、各自的左、右子列表;
详细流程,请看静态演示部分图示;
2. 演示:
【 静态演示 】:
3. 代码实现:
# 6快速排序
def quick_sort(List):
# 1.原列表长度
n = len(List)
# 2.若列表少于2个元素,返回当前列表(递归的结束条件)
if n < 2:
return List
# 3.选取基准值,这里选择首位元素,并将其从原列表中移除(因为要将剩下的元素分组)
base = List[0]
List.remove(base)
# 3.预先定义空列表,即基准值的左右两个列表
left, right = [], []
# 4.遍历剩下的元素
for value in List:
if value >= base:
# 大于等于基准值放右边
right.append(value)
else:
# 小于基准值放左边
left.append(value)
# 5.递归,将基准值放中间组合成已完成的有序列表
return quick_sort(left) + [base] + quick_sort(right)
if __name__ == '__main__':
List = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
result = quick_sort(List)
print(result)
三、插入排序(插入类)
1. 算法步骤:
① 将原列表第一个元素固定,当成是已排序列表,剩下的所有元素组成待排序列表;
② 从头开始,依次遍历待排序列表,同时从后往前遍历已排序列表进行比较,插入到合适位置,重复上一步骤;
注意: 待排序列表的元素与已排序列表中的某个元素相等时,则插入到相等元素的后面位置。
2. 演示:
3. 代码实现:
def insert_sort(List):
# 1.原列表长度
n = len(List)
# 2.依次遍历“待排序列表”(即原列表第2个元素开始)
for i in range(1, n