1.归并排序的思想:递归分治(先分解,再合并)
先使每个子序列有序,然后利用第三个数组合并两个有序数列,生成一个新的有序数列。
2.图解:
3.实现代码:
#include<bits/stdc++.h>
using namespace std;
void msort(int,int);
int a[100],r[110];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
msort(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}
void msort(int s,int t)
{
if(s==t)return ;//如果只有一个数字则直接返回,无需排序
int mid=(s+t)/2;
msort(s,mid);//分解左序列
msort(mid+1,t);//分解右序列
int i=s,j=mid+1,k=s;//下面合并
while(i<=mid&&j<=t)
{
if(a[i]<=a[j])
{r[k]=a[i];k++;i++;}
else
{r[k]=a[j];k++;j++;}
}
while(i<=mid){r[k]=a[i];k++;i++;}//复制左边子序列剩余
while(j<=t){r[k]=a[j];k++;j++;}//复制右边子序列剩余
for(int i=s;i<=t;i++)a[i]=r[i];
}