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) 算法穩定. */