1. 快速排序
"""
快速排序:
使用递归的方式,将待排序的序列通过分界值分割成两个部分,
其中一份的所有数据都比分界值小,两一部分的数据比分界值大
"""
def quick(my_list, start, end):
# 如果start >= end, 程序结束, 说明排好顺序了
if start >= end:
return # 结束递归, 即: 排序成功
# 定义变量 left 和 right, 分别表示: 起始 和 结束索引
left = start
right = end
# 定义变量 middle(mid), 表示: 分界值, 假设: 列表的第1个元素为: 分界值
mid = my_list[start]
# 具体的排序过程, 只要 left < right, 就说明没有找完, 就一直找
while left < right:
# 把 分界值右边 比分界值小的数据 放到 分界值的左边
# 如果 right位置的值 比 分界值大, right 就 -= 1
while my_list[right] >= mid and left < right:
right -= 1
# 走到这里, 说明, right索引的值 比分界值 小, 就赋值即可, 即: 把该值放到分界值的左边
my_list[left] = my_list[right]
# 把 分界值左边 比分界值大的数据 放到 分界值的右边
# 如果 left位置的值 比 分界值小, left 就 += 1
while my_list[left] < mid and left < right:
left += 1
# 走到这里, 说明, left索引的值 比分界值 大, 就赋值即可, 即: 把该值放到分界值的右边
my_list[right] = my_list[left]
# 走到这里, 说明 left >= right, 即: left索引的位置, 就是: 分界值的位置
my_list[left] = mid
# 走到这里, 说明本轮分界值位置都已锁定, 递归继续往下继续: 分别对分界值左边 和 分界值右边的数据, 做重复操作即可
# 分界值左边的数据, 继续排序
quick(my_list, start, left - 1)
# 分界值右边的数据, 继续排序
quick(my_list, right + 1, end)
def quickSort(data_list):
if len(data_list) <= 1:
return
quick(data_list, 0, len(data_list) - 1)
if __name__ == '__main__':
data_list = [7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
print(f"排序前的顺序:{data_list}")
quickSort(data_list)
print(f"排序后的顺序:{data_list}")
控制台输出
排序前的顺序:[7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
排序后的顺序:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2. 归并排序
"""
归并排序:
使用递归的方式将待排序的序列分割成两个只有一个元素的部分,
然后分别按顺序对比两个部分中的元素,将其归并为一个有序的序列
"""
def merge(left, right):
# 记录下标
r, l = 0, 0
# 定义有序列表
temp = []
# 循环归并
while l < len(left) and r < len(right):
# 若左边列表中的数更小
if left[l] <= right[r]:
# 将较小数放在有序列表中
temp.append(left[l])
l += 1
# 若右边列表的数更小
else:
# 将较小数放在有序列表中
temp.append(right[r])
r += 1
# 处理多余的数据
temp += left[l:]
temp += right[r:]
return temp
def mergerSort(data_list):
# 若只有一个数 结束递归
if len(data_list) <= 1:
return data_list
# 将带排序的数据分成两部分
num = len(data_list) // 2
# 左边部分
left = mergerSort(data_list[:num])
# 右边部分
right = mergerSort(data_list[num:])
# 递归处理
return merge(left, right)
if __name__ == '__main__':
data_list = [7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
print(f"排序前的顺序:{data_list}")
data_list = mergerSort(data_list)
print(f"排序后的顺序:{data_list}")
控制台输出
排序前的顺序:[7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
排序后的顺序:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]