编辑代码

#include <stdio.h>

// 合并并计算逆序对
long long mergeAndCount(int arr[], int left[], int right[], int leftSize, int rightSize) {
    int i = 0, j = 0, k = 0;
    long long inversions = 0;

    while (i < leftSize && j < rightSize) {
        if (left[i] <= right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
            inversions += leftSize - i;
        }
        k++;
    }

    while (i < leftSize) {
        arr[k] = left[i];
        i++;
        k++;
    }

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

    return inversions;
}

// 归并排序并计算逆序对
long long mergeSortAndCount(int arr[], int n) {
    if (n <= 1) {
        return 0; // 递归基本情形
    }

    int mid = n / 2;
    int left[mid];
    int right[n - mid];

    for (int i = 0; i < mid; i++) {
        left[i] = arr[i];
    }

    for (int i = mid; i < n; i++) {
        right[i - mid] = arr[i];
    }

    long long inversions = 0;
    inversions += mergeSortAndCount(left, mid);
    inversions += mergeSortAndCount(right, n - mid);
    inversions += mergeAndCount(arr, left, right, mid, n - mid);

    return inversions;
}

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

    long long inversions = mergeSortAndCount(arr, n);

    printf("逆序对的个数:%lld\n", inversions);

    return 0;
}