You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++用归并排序统计数组逆序对输出错误,求代码问题排查

逆序对计数代码问题修复说明

你提交的归并排序实现逆序对计数的代码存在一处逻辑错误,位于merge函数的逆序对计数计算行:

count += (mid - i);

这行的计算逻辑不正确。因为i是左子数组leftArray的局部下标,当leftArray[i] > rightArray[j]时,左子数组中从i到末尾的所有元素都比当前rightArray[j]大,每个元素都可以和当前右元素组成逆序对,因此正确的计数应该加上左子数组剩余的元素总数n1 - i,而非用原数组中点mid和i计算。

修正后完整代码

#include <vector>
using namespace std;
int merge(vector<int>& nums, int start, int mid, int end){
    int count = 0;
    int n1 = mid - start + 1;
    int n2 = end - mid;
    vector<int> leftArray(n1);
    vector<int> rightArray(n2);
    for(int i = 0; i < n1; i++){
        leftArray[i] = nums[start + i];
    }
    for(int i = 0; i < n2; i++){
        rightArray[i] = nums[mid + 1 + i];
    }
    int i = 0, j = 0, k = start;
    while(i < n1 && j < n2){
        if(leftArray[i] <= rightArray[j]){
            nums[k++] = leftArray[i++];
        }
        else{
            nums[k++] = rightArray[j++];
            // 修正此处的计数逻辑
            count += (n1 - i);
        }
    }
    while(i < n1){
        nums[k++] = leftArray[i++];
    }
    while(j < n2){
        nums[k++] = rightArray[j++];
    }
    return count;
}

int mergeSort(vector<int>& nums, int start, int end){
    if(start >= end) return 0;
    int count = 0;
    
    int mid = (start + end) / 2;
    count +=  mergeSort(nums, start, mid);
    count += mergeSort(nums, mid + 1, end);
    count += merge(nums, start, mid, end);
    return count;
}

int countInversions(vector<int>& nums) {
    return mergeSort(nums, 0, nums.size() - 1);
}

内容的提问来源于stack exchange,提问作者Ashwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:27:00