求排列的逆序数<归并><C++>

本文提供了一个使用C++实现的快速排序算法,并通过计算逆序数来评估排序效果。

程序

#include<cstdio>
using namespace std;
void gb_b(int p[],int a[],int i,int j,long long &ans){
    int e=(i+j)/2+1,q=i,w=0;
    do{
        if(a[q]>a[e]) p[w++]=a[e++];
        else if(a[q]==a[e]) p[w++]=a[q++],p[w++]=a[e++],ans+=e-(i+j)/2-2;
             else p[w++]=a[q++],ans+=e-(i+j)/2-1;
    }while(q<=(i+j)/2&&e<=j);
    if(q<=(i+j)/2) for(int k=q;k<=(i+j)/2;k++) p[w++]=a[k],ans+=e-(i+j)/2-1;
    if(e<=j) for(int k=e;k<=j;k++) p[w++]=a[k];
    w=0;
    for(int k=i;k<=j;k++) a[k]=p[w++];
}
void gb_g(int p[],int a[],int i,int j,long long &ans){
    if(j-i==0) return;
    gb_g(p,a,i,(i+j)/2,ans);
    gb_g(p,a,(i+j)/2+1,j,ans);
    gb_b(p,a,i,j,ans);
}
int main(){
    long long ans=0;
    int n;
    scanf("%d",&n);
    int a[n],p[n];
    for(int i=0;i<=n-1;i++) scanf("%d",&a[i]);
    gb_g(p,a,0,n-1,ans);
    printf("%lld",ans);
    return 0;
}
### C++ 分治算法计算排列逆序数 为了高效地计算排列中的逆序数,可以采用基于归并排序的分治策略。这种方法不仅能够有效地找出所有的逆序对,而且还能保持较低的时间复杂度。 下面是一个完整的C++程序示例,展示了如何利用分治法来计算给定数组中的逆序数量: ```cpp #include <vector> using namespace std; class Solution { public: int reversePairs(vector<int>& nums) { vector<int> tmp(nums.size()); return mergeSortCounting(nums, tmp, 0, nums.size() - 1); } private: // 辅助函数用于执行实际的分割与合并操作,并统计逆序数 int mergeSortCounting(vector<int>& nums, vector<int>& tmp, int left, int right) { if (left >= right) return 0; int mid = left + (right - left) / 2; int count = mergeSortCounting(nums, tmp, left, mid)[^4]; count += mergeSortCounting(nums, tmp, mid + 1, right); count += mergeAndCountSplitInv(nums, tmp, left, mid, right); return count; } // 合并两个子数组的同时计数跨越左右边界的逆序对数目 int mergeAndCountSplitInv(vector<int>& nums, vector<int>& tmp, int left, int mid, int right) { for (int i = left; i <= right; ++i) tmp[i] = nums[i]; int i = left, j = mid + 1, k = left, inv_count = 0; while (i <= mid && j <= right) { if (tmp[i] <= tmp[j]) { nums[k++] = tmp[i++]; } else { nums[k++] = tmp[j++]; inv_count += (mid - i + 1); // 当右边元素小于左边时产生的全部逆序对 } } while (i <= mid) nums[k++] = tmp[i++]; while (j <= right) nums[k++] = tmp[j++]; return inv_count; } }; ``` 此代码实现了`reversePairs()`方法,该方法接收一个整型向量作为输入参数,并返回整个数组中存在的逆序对总数。内部逻辑遵循经典的归并排序框架,在每次合并过程中额外增加了逆序对的检测机制[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值