十大基础排序 · 七 --- 2-路归并(稳定)

来源:互联网 发布:怎么安装发票软件 编辑:程序博客网 时间:2024/04/29 01:14

1. 分析

/*7. 2路-归并排序(MergeSort)#时间复杂度: O(nlogn);空间复杂度:O(n)//实现归并排序需和待排记录等数量的辅助空间;#分析:        1. 先分解左边,再分解右边    2. 左右两个分解完毕,直到小组仅有一个元素,返回    3. 返回上一级调用处(此时小组中是有2个元素的)    4. 执行Merge#特点: 稳定#实现方法:递归*/

2. 源码

void Merge(int arr[], int nLow, int nHigh){    int nStart1;    int nEnd1;    int nStart2;    int nEnd2;    int i;    int *pTemp = NULL;    pTemp = (int*)malloc(sizeof(int) * (nHigh - nLow +1));    //1. 分成2块再合并;    nStart1 = nLow;    nEnd1 = (nLow + nHigh) /2;    nStart2 = nEnd1 +1;    nEnd2 = nHigh;    i = 0;    while(nStart1 <= nEnd1 && nStart2 <= nEnd2)    {        if(arr[nStart1] < arr[nStart2])        {            pTemp[i] = arr[nStart1];            nStart1++;        }        else        {            pTemp[i] = arr[nStart2];            nStart2++;        }        i++;    }    //谁没结束,继续放谁    while(nStart1 <= nEnd1)    {        pTemp[i++] = arr[nStart1];        nStart1++;    }    while(nStart2 <= nEnd2)    {        pTemp[i++] = arr[nStart2];        nStart2++;    }    //将合并后的数据拷贝到原数组中    for(i=0; i< nHigh-nLow+1;i++)    {        //注意此处 arr 的下标处理        arr[i + nLow] = pTemp[i];    }    free(pTemp);    pTemp = NULL;    return ;}void MergeSort(int arr[], int nLow, int nHigh){    //2.左右两个分解完毕,直到小组仅有一个元素,返回    if(arr == NULL ||nLow >= nHigh)        return ;    //1.先分解左边,再分解右边    int nMid = (nLow + nHigh)/2;    MergeSort(arr,nLow, nMid);    MergeSort(arr,nMid+1, nHigh);    //3. 上述递归分解完毕,返回到这里继续执行;    Merge(arr, nLow, nHigh);}
阅读全文
0 0
原创粉丝点击