归并排序
归并排序算法复杂度为nlogn,算法是先分后并
用递归来分,每次分二分之一(该部分时间复杂度logn)
合并的时候两数组依次比较加入新数组中(该部分时间复杂度为n)
#include<iostream>
using namespace std;
int a[10240];///需要操作数组
int b[10240];///存储数组
void merge(int a[],int s,int m,int e,int tmp[])///合并数组
{
int pb=0;
int p1=s,p2=m+1;///第二个的起始位置为第一个的结束位置的后一个
while(p1<=m&&p2<=e){
if(a[p1]<a[p2])///装入数组
tmp[pb++]=a[p1++];
else
tmp[pb++]=a[p2++];
}
while(p1<=m)
tmp[pb++]=a[p1++];
while(p2<=e)
tmp[pb++]=a[p2++];
for(int i=0;i<e-s+1;i++)///将tmp装入a[]数组中
a[s+i]=tmp[i];
}
void mergesort(int a[],int s,int e,int tmp[])///a为处理数组,b为存储数组,s为起始坐标,e为排序结束坐标
{
if(s<e)///如果分到s==e则停止递归
{
int m=s+(e-s)/2;
mergesort(a,s,m,tmp);///处理前一半
mergesort(a,m+1,e,tmp);///处理后一半
merge(a,s,m,e,tmp);///处理完成后要合并
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i];
mergesort(a,0,n-1,b);
for(int i=0;i<n;++i)
cout<<a[i]<<",";
cout<<endl;
return 0;
}