目录
- 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;
- }