编辑代码

#include <stdio.h>
#include <limits.h>

//归并数组,A数组,p左下标-开始,r右下标-结束,q中间下标
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++;
        }
    }
}
//排序 A数组,p左边界,r右边界
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;
}