思想:分治
自顶向下二分数组,之后自下而上合并已经排序的数组。
归并排序两大核心操作:一分为二,合二为一
一分为二:将数组一分为二,一个无序的数组成为两个数组。
合二为一:将两个有序数组合并成为一个有序数组。
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e6+10;
int m[N];
int n;
int tmp[N];
void merge_sort(int m[],int l,int r)
{
if(l>=r) return;//递归边界
int mid=l+r>>1;//一定分界点
merge_sort(m,l,mid); merge_sort(m,mid+1,r);//二递归排序左右部分(一分为二)
int k=0,i=l,j=mid+1;
//三归并操作,联系数据结构中的合并两个有序序列,合并到数组tmp(合二为一)
while(i<=mid&&j<=r)
{
if(m[i]<=m[j]) tmp[k++]=m[i++];
else tmp[k++]=m[j++];
}
//四将左右两部分数组中未循环完的添加到tmp末尾(接尾)
while(i<=mid) tmp[k++]=m[i++];
while(j<=r) tmp[k++]=m[j++];
//五将tmp数组元素赋值回原数组m(复原)
for(int i=l,k=0;i<=r;i++,k++)
m[i]=tmp[k];
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&m[i]);
merge_sort(m,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",m[i]);
return 0;
}