python进阶江湖
归并排序
# -*- coding = utf-8 -*-
# @Time : 2022/5/19 19:15
# @Author : lxw_pro
# @File : py-20.py
# @Software : PyCharm
# 归并排序:
'''
归并的基本思想:
归并是指将若干个已排序好的有序表合并成一个有序表。
两个有序表的归并并称为二路归并。即:
将两个位置相邻的有序子序列R1[1...m]和R2[m+1...n]归并为一个有序序列R[1...n]。
归并排序的过程:
将待排序的n个记录,看作n个有序的子序列,每个子序列的长度为1.然后两两归并,得到n/2个长度为2或1的子序列;
在两两归并,...,如此重复,直到得到长度为n的子序列为止。这种排序的方法称为2路归并排序。
'''
# 整个归并排序需要[log2n]趟。
def mer(lia, lib): # 二路归并
lic = [] # 存储一个空列表
d = e = 0
while d < len(lia) and e < len(lib):
if lia[d] < lib[e]:
lic.append(lia[d])
d += 1 # 循环增加一次,不可或缺
else:
lic.append(lib[e])
e += 1 # 循环,同上
if d == len(lia):
for i in lib[e:]:
lic.append(i)
else:
for i in lia[d:]:
lic.append(i)
return lic
def mer_sort(li): # 归并排序
if len(li) <= 1: # 如果元素只有一个或者少于一个
return li # 输出原有的即可
mid = len(li) // 2 # 找到中间元素,一定要整除(//)
left = mer_sort(li[:mid]) # 左边的元素
right = mer_sort(li[mid:]) # 右边的元素
return mer(left, right)
li = [13, 14, 52, 2, 5, 9]
print(mer_sort(li))
算法分析:
'''
1-每趟归并的时间复杂度为O(n),整个算法需log2n趟。
时间复杂度为O(nlog2n)
2-归并排序算法虽然简单,
但占用辅助空间大,实用性差。
3-归并排序是一个稳定排序。
'''
上一章链接:基数排序
江湖一现:
不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。