#include <stdio.h>
#include <limits.h>
void merge(int A[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int L[n1+1], R[n2+1];
for (int i = 0; i < n1; i++)
L[i] = A[p + i];
for (int j = 0; j < n2; j++)
R[j] = A[q + 1 + j];
L[n1] = INT_MAX;
R[n2] = INT_MAX;
int i = 0, j = 0;
for (int k = p; k <= r; k++) {
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
} else {
A[k] = R[j];
j++;
}
}
}
void mergeSort(int A[], int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(A, p, q);
mergeSort(A, q + 1, r);
merge(A, p, q, r);
}
}
void show(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
printf("递归算法-分治法-归并排序!\n");
int arr[] = {5, 1, 2, 6, 9, 8, 3, 0, 4};
int size = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: ");
show(arr, size);
mergeSort(arr, 0, size - 1);
printf("排序后数组: ");
show(arr, size);
return 0;
}