概念:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的。
分治法在每一层递归上都有三个步骤:
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3 合并:将各个子问题的解合并为原问题的解。
思路:对于给定的一组记录(假设有n个记录),首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或者1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。
例子
根据这波分析,我们可以看看对上图的一个行为。
当最左边的分到最细之后无法再划分左右然后开始进行合并。
第一次组合完成[4, 7]的合并
第二次组合完成[4, 7, 8]的合并
第三次组合完成[3, 5]的合并
第四次组合完成[3, 5, 9]的合并
第五次组合完成[3, 4, 5, 7, 8, 9]的合并结束排序。
python实现
import math
import copy as cp
def merge_sort(array, start, end): //寻找中点分割数据
if start<end:
mid=(start+end)//2
merge_sort(array, start, mid)
merge_sort(array, mid+1, end)
merge_array(array, start, mid, end)
def merge_array(array, start, mid, end):
tmp=[]
i=start
j=mid+1
while (i<=mid and j<=end): 限定左右两边数一一比较
if array[i]<array[j]: 小的加入新数组中,并且索引+1循环迭代
tmp.append(array[i])
i=i+1
else:
tmp.append(array[j])
j=j+1
while i<=mid:
tmp.append(array[i])
i=i+1
while j<=end:
tmp.append(array[j])
j=j+1
index=start
for item in tmp:
array[index]=item
index=index+1
if __name__=='__main__':
testlist=[1,4,6,2,3,5,7,9,2,4]
n=len(testlist)
merge_sort(testlist,0,n-1)
print(testlist)