目录
递归
void _MergeSort(int* arr, int* tmp, int left, int right)
{
if (left >= right)
return;
int mid = (left + right) / 2;
_MergeSort(arr, tmp, left, mid);
_MergeSort(arr, tmp, mid + 1, right);
int l1 = left;
int l2 = mid + 1;
int r1 = mid;
int r2 = right;
int i = left;
while (l1 < r1 && l2 < r2)
{
if (arr[l1] <= arr[l2])
tmp[i++] = arr[l1++];
else
tmp[i++] = arr[l2++];
}
while (l1 <= r1)
tmp[i++] = arr[l1++];
while (l2 <= r2)
tmp[i++] = arr[l2++];
memcpy(arr + left, tmp + left, (right - left + 1) * sizeof(int));
}
void MergeSort(int* arr, int size)
{
int* tmp = (int*)malloc(sizeof(int) * size);
assert(tmp);
_MergeSort(arr, tmp, 0, size - 1);
free(tmp);
tmp = NULL;
}
非递归
void MergeSortNonR(int* arr, int* tmp, int size)
{
int tmp = (int*)malloc(sizeof(int) * size);
assert(tmp);
int gap = 1;
while (gap < size)
{
for (int j = 0; j < size; j += 2 * gap)
{
int begin1 = j, end1 = j + gap - 1;
int begin2 = j + gap, end2 = j + 2 * gap - 1;
if (end1 >= size)
break;
if (begin2 >= size)
break;
if (end2 >= size)
end2 = size - 1;
int i = j;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] <= arr[begin2])
tmp[i++] = arr[begin1++];
else
tmp[i++] = arr[begin2++];
}
while (begin1 <= end1)
tmp[i++] = arr[begin1++];
while (begin2 <= end2)
tmp[i++] = arr[begin2++];
memcpy(arr + j, tmp + j, (end2 - j + 1) * sizeof(int));
}
gap *= 2;
}
free(tmp);
tmp = NULL;
}