编辑代码

#include <stdio.h>

// 归并排序并计算逆序对个数
int mergeSortAndCount(int arr[], int temp[], int left, int right) {
    int count = 0;
    if (left < right) {
        int mid = left + (right - left) / 2;

        // 分解为子问题
        count += mergeSortAndCount(arr, temp, left, mid);
        count += mergeSortAndCount(arr, temp, mid + 1, right);

        // 合并子问题的解并计算逆序对个数
        count += mergeAndCount(arr, temp, left, mid, right);
    }
    return count;
}

// 合并两个有序数组并计算逆序对个数
int mergeAndCount(int arr[], int temp[], int left, int mid, int right) {
    int i = left;       // 左子数组的起始索引
    int j = mid + 1;    // 右子数组的起始索引
    int k = left;       // 合并后数组的起始索引
    int count = 0;

    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
            count += (mid - i + 1);  // 左子数组剩余的元素都是逆序对
        }
    }

    while (i <= mid) {
        temp[k++] = arr[i++];
    }

    while (j <= right) {
        temp[k++] = arr[j++];
    }

    // 将临时数组的元素复制回原数组
    for (i = left; i <= right; i++) {
        arr[i] = temp[i];
    }

    return count;
}

int main() {
    int arr[] = {2, 4, 3, 1, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);

    int temp[n];  // 临时数组用于辅助排序

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

    int count = mergeSortAndCount(arr, temp, 0, n - 1);

    printf("逆序对个数: %d\n", count);

    return 0;
}