合并排序
合并排序是用分治策略实现的排序算法之一。
基本思想是:将待排序的元素分成大小大致相同的两个子集合,分别对这两个子集合进行排序,最后将排好序的子集合合并成所需要的集合。
此方法的时间复杂度T(n)=O(nlogn),这种排序方法渐进最优算法。
//合并排序-递归
#include <iostream>
using namespace std;
void msort(int a[],int b[],int low,int high)
{
if (low<high) //至少有两个元素
{
int k=(low+high)/2; //取中点
msort(a,b,low,k);
msort(a,b,k+1,high);
int i=low,j=k+1,n=low;
while(i<=k&&j<=high) //合并到数组b
{
if (a[i]>a[j])
{
b[n]=a[j];
j++;
n++;
}
else {
b[n]=a[i];
i++;
n++;
}
}
while(i<=k)
{
b[n]=a[i];
i++;
n++;
}
while(j<=high)
{
b[n]=a[j];
j++;
n++;
}
for(i=low;i<=high;i++) //复制回数组a
a[i]=b[i];
}
}
int main()
{
int n,i,a[100],b[100];
cin>>n;
for (i=0;i<n;i++)
cin>>a[i];
msort(a,b,0,n-1);
for (i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}