归并排序模板

看了算法导论之后,学了一个小技巧,L1[nL1] = L2[nL2] = ∞,比较时好操作,不用进行边界的讨论


#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define inf 0x3f3f3f
using namespace std;


void merge(int a[],int p,int q,int r){
    int nL1 = q-p+1;
    int nL2 = r-q;
    //init
    int *L1 = (int *)malloc(sizeof(int)*nL1+1);
    int *L2 = (int *)malloc(sizeof(int)*nL2+1);

    for(int i=0;i<nL1;i++)
        L1[i] = a[p+i];
    for(int i=0;i<nL2;i++)
        L2[i] = a[q+1+i];
    //inf
    L1[nL1] = inf;
    L2[nL2] = inf;

    int i=0;
    int j=0;
    for(int k=p;k<=r;k++){
        if(L1[i]<=L2[j]){
            a[k] = L1[i];
            i++;
        }
        else{
            a[k] = L2[j];
            j++;
        }
    }
    //free
    free(L1);
    free(L2);
}

void mergeSort(int a[],int p,int r){
    if(p>=r)return;
    int q=(p+r)/2;
    mergeSort(a,p,q);
    mergeSort(a,q+1,r);
    merge(a,p,q,r);
}

ostream& printResult(ostream&cout,int a[],int n){
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return cout;
}

int main()
{
    int n;
    cin>>n;
    int *a =(int *) malloc(sizeof(int)*n);

    for(int i=0;i<n;i++)
        a[i] = rand()%1000;
    printResult(cout,a,n);
    mergeSort(a,0,n-1);
    printResult(cout,a,n);
    free(a);
    //cout << "Hello world!" << endl;
    return 0;
}
View Code

 

posted @ 2016-03-25 20:59  iEdson  阅读(156)  评论(0编辑  收藏  举报