歸併排序遞歸與非遞歸的實現

方法一:遞歸形式的歸併排序
複製代碼
void merge(int a[],int b[],int l,int m,int r){
//    int *b=new int[r-l+1];
    int i,j,k;
    i=l;
    j=m+1;
    k=l;
    while(i<=m&&j<=r){
        if(a[i]<a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }
    while(i<=m)
        b[k++]=a[i++];
    while(j<=r)
        b[k++]=a[j++];
    for(int s=l;s<=r;s++)
        a[s]=b[s];
//    delete[] b;
}
void msort(int a[],int b[],int l,int r){
    if(l<r){
        int m=(l+r)/2;
        msort(a,b,l,m);
        msort(a,b,m+1,r);
        merge(a,b,l,m,r);
    }
}
void merge_sort(int a[],int n){
    _FUNC;
    int *b=new int[n];
    msort(a,b,0,n-1);
    delete[] b;
}
複製代碼

  方法二:去除遞歸的方法  

複製代碼
void merge_pass(int x[],int y[],int s,int n){
    int i=0;
    while(i+2*s-1<n){
        merge(x,y,i,i+s-1,i+2*s-1);
        i+=2*s;
    }
    if(i+s<n)
        merge(x,y,i,i+s-1,n-1);
    else
        for(int j=i;j<=n-1;j++)
            y[j]=x[j];
}
void merge_sort2(int a[],int n){
    _FUNC;
    int *b=new int [n];
    int s=1;
    while(s<n){
        merge_pass(a,b,s,n);
        s+=s;
        merge_pass(b,a,s,n);
        s+=s;
    }
    delete[] b;
}
發佈了26 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章