编辑代码

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

// 合并两个有序数组并统计逆序对个数
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 (int l = left; l <= right; l++) {
        arr[l] = temp[l];
    }

    return count;
}

// 归并排序并统计逆序对个数
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 countInversions(int arr[], int size) {
    int* temp = (int *)malloc(size * sizeof(int));
    int count = mergeSortAndCount(arr, temp, 0, size - 1);
    free(temp);
    return count;
}

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

    int inversionCount = countInversions(arr, size);

    printf("Number of inversions: %d\n", inversionCount);

    return 0;
}