编辑代码

#include <iostream>
#include <vector>

long long mergeAndCount(std::vector<int>& arr, std::vector<int>& temp, int left, int mid, int right) {
    int i = left;
    int j = mid + 1;
    int k = left;
    long long 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;  // Count the number of inversions
        }
    }

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

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

    for (int m = left; m <= right; m++) {
        arr[m] = temp[m];
    }

    return count;
}

long long mergeSortAndCount(std::vector<int>& arr, std::vector<int>& temp, int left, int right) {
    long long count = 0;
    if (left < right) {
        int mid = left + (right - left) / 2;

        count += mergeSortAndCount(arr, temp, left, mid);      // Count inversions in left subarray
        count += mergeSortAndCount(arr, temp, mid + 1, right);  // Count inversions in right subarray

        count += mergeAndCount(arr, temp, left, mid, right);    // Count inversions between left and right subarrays
    }
    return count;
}

long long countInversions(std::vector<int>& arr) {
    int n = arr.size();
    std::vector<int> temp(n);
    return mergeSortAndCount(arr, temp, 0, n - 1);
}

int main() {
    std::vector<int> arr = {2, 4, 3, 1, 5, 6};
    long long inversionCount = countInversions(arr);
    std::cout << "逆序对的个数为: " << inversionCount << std::endl;
    return 0;
}