Acwing788 逆序对的数量(归并排序的运用)

文章提供了一个归并排序的详细讲解,包括其工作原理和代码实现。特别指出在计算逆序对数量时,归并排序的优势在于交换次数等于逆序对数量。代码示例中展示了如何使用归并排序进行数组排序,并计算过程中产生的逆序对。
摘要由CSDN通过智能技术生成

归并排序讲解http://t.csdn.cn/Er5T4这个讲解的挺好的,可作为备用基础知识。

接下来附上题目要求

 附上代码

//hhhh终于搞懂了 这里是不能用暴力的 暴力的话 n2会超时(应该把)然后我们用归并 为什么用归并呢,因为归并调换的次数就是逆序对的数量呀
//这里首先要搞懂归并的过程的代码,那你看 我们的代码是先分成两个然后进行对比排序 那res=左边所有+右边所有+(左右);
//废话不多说 showcode
#include <iostream>
using namespace std;
typedef long long LL;
const int N=100000;
LL res=0;
int q[N],tmp[N];
LL merge_sort(int q[],int l,int r)
{
if(l>=r)
return 0;
int mid=(l+r)/2;

res= merge_sort(q,l,mid)+merge_sort(q,mid+1,r);


int i=l;
int j=mid+1;
int k=0;

while(i<=mid&&j<=r)
{
 if(q[i]<=q[j])//这个等号没有加 一定要灵活运用呀
 tmp[k++]=q[i++];
 else
 {
     tmp[k++]=q[j++];
 
     res+=mid-i+1;
 }
    
}

//扫尾

while(i<=mid)
tmp[k++]=q[i++];
while(j<=r)
tmp[k++]=q[j++];

//赋值加不加无所谓了吧 没加结果是2 我加上试试、加上还是有用的
for(int i=l,j=0;i<=r;j++,i++)//这里记得有等号 因为现在是两个小区间的大区间呀
q[i]=tmp[j];

return res;
}


int main()
{
    int n;
    
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
        
    }
    
   // int x=merge_sort(q,0,n-1);这里我之前写错了 没有用大数 这不是乱转么
    
    cout<<merge_sort(q,0,n-1);
    
    
}

好了,那我们在遇到什么题的时候会用到归并排序呢?

看这个吧归并排序会在哪里出现 怎么用http://t.csdn.cn/qKMzW

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值