八大排序之歸併排序

#include <iostream>//自頂向下的方法

using namespace std;

void MergeSort(int numbers[], int length);
void MergeSortCore(int numbers[], int tempArr[], int lowIndex, int highIndex);
void Merge(int numbers[], int tempArr[], int lStart, int rStart, int rEnd);

int main()
{
    //int numbers[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int length = 0;
    cin >> length;
    int* numbers = new int[length];
    for (int i = 0; i < length; ++i)
        cin >> numbers[i];

    MergeSort(numbers, length);

    for (int i = 0; i < length; ++i)
        cout << numbers[i] << " ";
    cout << endl;

    system("pause");
    return 0;
}

void MergeSort(int numbers[], int length)
{
    int* pTempArr = new int[length];

    if (pTempArr != NULL)//可能申請內存失敗
    {
        MergeSortCore(numbers, pTempArr, 0, length - 1);

        delete[]pTempArr;
        pTempArr = NULL;
    }
}

void MergeSortCore(int numbers[], int tempArr[], int lowIndex, int highIndex)
{
    if (lowIndex >= highIndex) return;

    int midIndex = (highIndex - lowIndex) / 2 + lowIndex;//這樣做是爲了防止兩個數相加後會溢出
    MergeSortCore(numbers, tempArr, lowIndex, midIndex);
    MergeSortCore(numbers, tempArr, midIndex+1, highIndex);
    Merge(numbers, tempArr, lowIndex, midIndex + 1, highIndex);
}

void Merge(int numbers[], int tempArr[], int lStart, int rStart, int rEnd)
{
    int lEnd = rStart - 1;
    int tempArrIndex = lStart;
    int numElements = rEnd - lStart + 1;

    while (lStart <= lEnd && rStart <= rEnd)
    {
        if (numbers[lStart] <= numbers[rStart])
            tempArr[tempArrIndex++] = numbers[lStart++];
        else tempArr[tempArrIndex++] = numbers[rStart++];
    }

    while (lStart <= lEnd)
        tempArr[tempArrIndex++] = numbers[lStart++];
    while (rStart <= rEnd)
        tempArr[tempArrIndex++] = numbers[rStart++];


    for (int i = 0; i < numElements; ++i,--rEnd)//從rEnd開始往前複製numElements個元素(即長度)還給原始數組
        numbers[rEnd] = tempArr[rEnd];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章