#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];
}
八大排序之歸併排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.