归并排序的学习过程
在知乎上搜索相关内容:
先在必应和知乎上搜索归并排序的概念:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
自下而上的迭代
主要思想:
分解(Divide):将n个元素分成个含n/2个元素的子序列。
解决(Conquer):用合并排序法对两个子序列递归的排序。
合并(Combine):合并两个已排序的子序列已得到排序结果。
算法步骤:
1申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
2设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重4复步骤 3 直到某一指针达到序列尾;
5将另一序列剩下的所有元素直接复制到合并序列尾。
动画演示
知乎链接:排序算法之归并排序
B站学习视频
动态的图解了分解和合并的过程,用c代码实现的,讲的很细致,推荐大家去看。
截图展示部分递归代码:
归并排序【图解+代码】
python代码实现
#merge的功能是将前后相邻的两个有序表归并为一个有序表的算法。
def merge(left, right):
ll, rr = 0, 0
result = []
while ll < len(left) and rr < len(right):
if left[ll] < right[rr]:
result.append(left[ll])
ll += 1
else:
result.append(right[rr])
rr += 1
result+=left[ll:]
result+=right[rr:]
return result
def merge_sort(alist):
if len(alist) <= 1:
return alist
num = len(alist) // 2 # 从中间划分两个子序列
left = merge_sort(alist[:num]) # 对左侧子序列进行递归排序
right = merge_sort(alist[num:]) # 对右侧子序列进行递归排序
return merge(left, right) #归并
tesl=[1,3,45,23,23,12,43,45,33,21]
print(merge_sort(tesl))
#[1, 3, 12, 21, 23, 23, 33, 43, 45, 45]
实验结果
参考链接python实现归并排序