八大内部排序 -- 归并排序

来源:互联网 发布:网络大仲马什么意思 编辑:程序博客网 时间:2024/05/21 14:54

归并排序(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;}


0 0
原创粉丝点击