1.定义:
是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
2.算法思想:
(1)分治
(2)递归
3.算法思路:
(1) 拆分 将数组拆分 每个数分开
(2)合并 将已经排序完毕的两个数组合并成一个有序数组
4.图示
5.c++代码
#include<bits/stdc++.h>
using namespace std;
#define N 100010
int a[N];
int tmp[N];//记录数组 记录合并时的结果
void merge_sort(int a[],int l,int r)
{
if(l>=r) return ;//分到不能再拆时结束拆分 开始合并排序
int mid=l+r>>1;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);//拆分
int i=l,j=mid+1;
int k=0;//tmp数组指针
while(i<=mid&&j<=r)
{
if(a[i]<=a[j]) tmp[k++]=a[i++];
else tmp[k++]=a[j++];
/*比较当前两个已经排序完毕的数组的第一个元素
将更小的那个插入记录数组tmp
更新i指针/j指针和k指针
*/
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
//若其中一个数组有剩余,则将剩余的按顺序插入tmp
for(int i=l,j=0;i<=r;i++,j++)
{
a[i]=tmp[j];
//用已经排序完毕的tmp数组覆盖a的l到r的部分
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
merge_sort(a,1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}