以下是使用归并排序求逆序对数量的C++代码:

#include <iostream>
#include <vector>

using namespace std;

long long merge(vector<int>& nums, vector<int>& temp, int left, int mid, int right) {
    int i = left, j = mid + 1, k = left;
    long long count = 0;
    while (i <= mid && j <= right) {
        if (nums[i] <= nums[j]) {
            temp[k++] = nums[i++];
        } else {
            temp[k++] = nums[j++];
            count += mid - i + 1;
        }
    }
    while (i <= mid) {
        temp[k++] = nums[i++];
    }
    while (j <= right) {
        temp[k++] = nums[j++];
    }
    for (int l = left; l <= right; l++) {
        nums[l] = temp[l];
    }
    return count;
}

long long mergeSort(vector<int>& nums, vector<int>& temp, int left, int right) {
    if (left >= right) {
        return 0;
    }
    int mid = left + (right - left) / 2;
    long long count = 0;
    count += mergeSort(nums, temp, left, mid);
    count += mergeSort(nums, temp, mid + 1, right);
    count += merge(nums, temp, left, mid, right);
    return count;
}

long long countReversePairs(vector<int>& nums) {
    int n = nums.size();
    vector<int> temp(n);
    return mergeSort(nums, temp, 0, n - 1);
}

int main() {
    vector<int> nums = {7, 5, 6, 4};
    cout << countReversePairs(nums) << endl; // 5
    return 0;
}

该算法时间复杂度为O(n log n),空间复杂度为O(n)。

生成一段求逆序对数量的c++代码

原文地址: https://www.cveoy.top/t/topic/bb7R 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录