#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];
}
八大排序之归并排序
最新推荐文章于 2025-03-26 23:23:47 发布