编辑代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

bool merge(int array[], int arrStart, int mid, int arrEnd) {
    int arrLen = arrEnd - arrStart;
    if (arrLen < 2) {
        return false;
    }

    int *temp = (int *)malloc(arrLen * sizeof(int));
    int i = arrStart;
    int j = mid;
    int tempIndex = 0;

    while (i < mid && j < arrEnd) {
        if (array[i] > array[j]) {
            temp[tempIndex] = array[j++];
        } else {
            temp[tempIndex] = array[i++];
        }
        ++tempIndex;
    }

    // 小数组有剩余数据
    while (i < mid) {
        temp[tempIndex++] = array[i++];
    }

    while (j < arrEnd) {
        temp[tempIndex++] = array[j++];
    }

    // 把排好序的数据拷贝回去
    for ((tempIndex = 0, i = arrStart); (tempIndex < arrLen && i < arrEnd); (++tempIndex, ++i)) {
        array[i] = temp[tempIndex];
    }

    free(temp);
    temp = NULL;
}

bool mergeSort(int array[], int arrStart, int arrEnd) {
    int arrLen = arrEnd - arrStart;
    if (arrLen < 0) {
        printf("请重新输入!");
        return false;
    }

    // 写终止条件
    if (arrLen == 0 || arrLen == 1) {
        return true;
    }

    int middle = arrStart + arrLen / 2;

    mergeSort(array, arrStart, middle);
    mergeSort(array, middle, arrEnd);
    // 合并
    return merge(array, arrStart, middle, arrEnd);
}

void printArray(int array[], int arrLen) {
    for (int i = 0; i < arrLen; ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main() {
    int array0[] = {49,38,65,97,76,13,27};
    int arrayLen = sizeof(array0) / sizeof(int);

    printf("归并排序前:");
    printArray(array0, arrayLen);
    mergeSort(array0, 0, arrayLen);
    printf("归并排序后:");
    printArray(array0, arrayLen);

    printf("=========================================\n");

    int array1[] = {20,23,11,5,21,33};
    int arrayLen1 = sizeof(array1) / sizeof(int);

    printf("归并排序前:");
    printArray(array1, arrayLen1);
    mergeSort(array1, 0, arrayLen1);
    printf("归并排序后:");
    printArray(array1, arrayLen1);


}