merge sort 歸并排序

  • basic merg sort
    給兩個(gè)排好序的序列,將它們混合排序好 NlogN
public void mergeSort(int a[],int[] aux,int io,int mid,int hi){
    //precondition:a[lo……mid],a[mid+1……h(huán)i] is sorted
    for(int i=lo;i<=hi;i++){
        aux[i] = a[i]
    }
    int p = lo,q = mid+1;
    for(int i=lo;i<=hi;i++){
        if(i>mid) a[i] = aux[q++];
        else if(q>hi) a[i] = aux[p++];
        else if(aux[p]<=aux[q]) a[i] = aux[p++];
        else a[i] = aux[q++];
    }
    
}

利用遞歸實(shí)現(xiàn)merge sort:

public void sort(int[] a,int[] aux,int lo,int hi){
    if(lo>=hi) return;
    int mid = lo+(hi-lo)/2;
    sort(a,aux,lo,mid);
    sort(a,aux,mid+1,hi);
    merge(a,aux,lo,mid,hi);
}

public void sort(int[] a){
    int aux = new int[a.length];
    sort(a,aux,0,a.length-1);
}
  • bottom up merge sort
    不用遞歸,從1開始merge,然后是2,會(huì)得到一堆長(zhǎng)度為2并且排好序的subarrays,然后是4,得到一堆長(zhǎng)度為4的排好序的subarrays……
    merge的代碼和上面相同,不同的是sort的代碼:
public void sort(int[] a){
    int N = a.length;
    for(int size = 1;size<N;size = size+size){
        for(int lo = 0;lo<N-size;lo=lo+size+size){
            merge(a,lo,lo+size-1;Math.min(lo+size+size-1,N-1));
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容