归并排序

归并排序的思想是将数组分成n个有序的数组

刚开始可以想象把数组分成length个数组,每个数组只有一个元素

那么他们一定是有序的

然后不停的将两个有序的数组进行合并,最后合并成完整的数组

代码如下

void Merge(int arr[],int nLow,int nHigh)
{
    int nBegin1;
    int nBegin2;
    int nEnd1;
    int nEnd2;
    
    //再分组 
    nBegin1 = nLow;
    nEnd1 = nLow +(nHigh-nLow)/2;
    nBegin2 = nEnd1+1;
    nEnd2 = nHigh;
    //申请一个辅助数组 
    int *pTemp = NULL;
    pTemp = (int*)malloc(sizeof(int)*(nHigh-nLow+1));

    int i;
    i = 0;
    //将分完的两个有序数组中的元素依次插入到辅助数组中 
    while(nBegin1 <= nEnd1 && nBegin2 <= nEnd2)
    {
        if(arr[nBegin1] < arr[nBegin2])
        {
            pTemp[i] = arr[nBegin1];
            i++;
            nBegin1++;
        }
        else
        {
            pTemp[i] = arr[nBegin2];
            i++;
            nBegin2++;
        }
    }

    //此时可能会有一个有序数组中有元素
    //将其剩余元素插入到辅助数组中 
    while(nBegin1 <= nEnd1)
    {
        pTemp[i] = arr[nBegin1];
        i++;
        nBegin1++;
    }

    while(nBegin2 <= nEnd2)
    {
        pTemp[i] = arr[nBegin2];
        i++;
        nBegin2++;
    }

    //把辅助数组中的值赋值到原数组中去 
    for(i = 0;i<nHigh-nLow+1;i++)
    {
        arr[nLow+i] = pTemp[i];
    }

    free(pTemp);
    pTemp = NULL;
}

void MergeSort(int arr[],int nLow,int nHigh)
{
    if(arr == NULL || nLow >= nHigh)return;
    
    int nMid;
    nMid = nLow + (nHigh-nLow)/2;

    //分组 
    MergeSort(arr,nLow,nMid);
    MergeSort(arr,nMid+1,nHigh);

    //合并 
    Merge(arr,nLow,nHigh);
}
原文地址:https://www.cnblogs.com/TheQi/p/9115343.html