时间复杂度O(nlog n); 需要 O(n) 额外空间,稳定的排序
#include<iostream>
#include<cstdlib>
using namespace std;
//谓词函数
template<class T> bool Elemasc(const T &left,const T &right)
{
return left<right;
}
template<class T> bool Elemdesc(const T &left,const T &right)
{
return left>right;
}
//并归
template<class T,class Comparefunc> void Merge(T A[],int p, int q, int r, Comparefunc func)
{
int len1 = q - p + 1;
int len2 = r - q;
int i,j,k;
/*分配两个分数组*/
T* L=new T[len1];
T* R=new T[len2];
memcpy(L,A+p,len1*sizeof(T));
memcpy(R,A+q+1,len2*sizeof(T));
// for(i=0;i<n1;i++)
// L[i] = A[p+i];
// for(j=0;j<n2;j++)
// R[j] = A[q+j+1];
i=j=0;
for(k=p;k<=r;k++)
{
/*越界判断*/
if(i == len1)
{
A[k]=R[j++];
continue;
}
if(j == len2)
{
A[k]=L[i++];
continue;
}
/*并归赋值*/
if(func(L[i],R[j]))
A[k]=L[i++];
else if(j!=len2)
A[k]=R[j++];
}
delete []L;
delete []R;
}
//排序
template<class T,class Comparefunc> void MergeSort(T A[],int p,int r,Comparefunc func)
{
if(p<r)
{
MergeSort(A,p,(p+r)/2,func);
MergeSort(A,(p+r)/2+1,r,func);
Merge(A,p,(p+r)/2,r,func);
}
}
int main()
{
int a[] = {2,3,5,1,42,123,235,334,234,6,4,2342,12,23,4,};
int len = sizeof(a)/sizeof(int);
cout << len <<endl;
MergeSort(a,0,len-1,Elemasc<int>);//升序
for(int i=0;i<len;i++)
cout << a[i] <<" ";
cout<<endl;
MergeSort(a,0,len-1,Elemdesc<int>);//降序
for(int i=0;i<len;i++)
cout << a[i] <<" ";
cin >> len;
return 0;
}