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