二路歸並排序C/C++


void Merge(int a[],int low,int mid,int high); void MergeSort(int a[],int low,int high); //將兩個非降序序列low--mid,mid+1--high合並為一個新的非降序序列
void Merge(int a[],int low,int mid,int high) { int len = high-low+1; int *temp = new int[len]; int i = low,j = mid+1;    //i,j分別為兩個子序列的游標
    int k = 0;     //為新合並序列的游標
    while(i<=mid && j<=high){ if(a[i]<=a[j]){ temp[k] = a[i]; k++; i++; }else{ temp[k] = a[j]; k++; j++; } } while(i<=mid){    //若第一個子序列有剩余,則直接接到尾部
        temp[k] = a[i]; k++; i++; } while(j<=high){    //若第二個子序列有剩余,則直接接到尾部
        temp[k] = a[j]; k++; j++; } //copy到a[]
    for(k=0;k<len;k++) a[low+k] = temp[k]; } //low high為待排序列左右邊界
void MergeSort(int a[],int low,int high) { if(low<high){ int mid = (low+high)/2; //遞歸的划分左右兩個子序列
 MergeSort(a,low,mid); MergeSort(a,mid+1,high); //合並
 Merge(a,low,mid,high); } } /* 算法分析: time-complexity: 總共需要進行log2n趟排序,每次排序執行n次基本操作, 整個二路歸並排序執行次數為nlog2n,時間復雜度為O(nlog2n) space-complexity: 整個二路歸並排序需要轉存整個序列temp[len],因此空間復雜度為O(1) 算法穩定. */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM