二路归并排序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