归并排序分两步:
1、分:二分法,让每个组元素都有序,只有每个组只有一个元素时才一定有序。
2、合:按照二分法分出的小组组合。
void Merge(int arr[], int tmp[], int startIndex, int midIndex, int endIndex)
{
int i = startIndex;
int j = midIndex + 1;
int k = startIndex;
while (i != midIndex + 1 && j != endIndex + 1)
{
if (arr[i] > arr[j])
{
tmp[k++] = arr[j++];
}
else
{
tmp[k++] = arr[i++];
}
}
while (i != midIndex + 1)
{
tmp[k++] = arr[i++];
}
while (j != endIndex + 1)
{
tmp[k++] = arr[j++];
}
for (int i = startIndex; i <= endIndex; ++i)
{
arr[i] = tmp[i];
}
}
void MergeSort(int arr[], int tmp[], int startIndex, int endIndex)
{
if (startIndex < endIndex)
{
int midIndex = (startIndex + endIndex) / 2;
MergeSort(arr, tmp, startIndex, midIndex);
MergeSort(arr, tmp, midIndex + 1, endIndex);
Merge(arr, tmp, startIndex, midIndex, endIndex);
}
}