归并排序(merge-sort):将两个或两个以上的有序列表组合成一个新的有序表,合并的m,n长度的两个表的复杂度为O(m+n),n个数的序列进行归并共有ceil(logn)次,每一次合并都是n常数级别的,所以总的复杂度为O(nlogn)。同时归并排序是一种稳定的排序。
代码如下,采用的是利用递归的方式书写,要对递归的工作方式要有比较深刻的理解哦。。
#include <iostream>
using namespace std;
void print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void Merge(int*sr,int*& tr,int i,int m,int n){
// 将有序表sr[i...m],sr[m+1...n]合并成tr[i...n]
int k,j;
for(j=m+1,k=i;j<=n&&i<=m;k++){
if(sr[i]<sr[j]){
tr[k]=sr[i++];
}else{
tr[k]=sr[j++];
}
}
while(i<=m){
tr[k++]=sr[i++];
}
while(j<=n){
tr[k++]=sr[j++];
}
}
void Msort(int* sr,int*& tr,int s,int t){
// 将表sr[s....t]归并成有序表tr[s....t]
if(s==t)
tr[s]=sr[s];
else{
int m = (s+t)/2;
int *mr = new int[t+1];
Msort(sr,mr,s,m);
Msort(sr,mr,m+1,t);
Merge(mr,tr,s,m,t);
}
}
void Merge_sort(int *a,int n){
Msort(a,a,1,n);
}
int main()
{
int *a;
int n;
cin>>n;
a= new int[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
Merge_sort(a,n);
print(a,n);
return 0;
}