二路归并排序C/C++

2018/04/17 21:45
阅读数 140
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)
        算法稳定.
*/

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部