首页 > 编程语言 > 详细

利用归并排序求逆序对数

时间:2018-07-13 17:09:34      阅读:295      评论:0      收藏:0      [点我收藏+]

技术分享图片

现给出这个定义,什么是逆序对,NOIP火柴排队这个题是逆序对的一个比较好的例题,这里我们只讨论求逆序对的一些高效的算法

一般有归并排序以及树状数组两种方法,本文只讨论归并排序求逆序对

这里不给出原理只给出实现,注意下面这一句

                ans+=m-p;

把这句话加在归并排序的合并过程中即可,下面给出实现代码:

 1 #include<iostream>
 2 using namespace std;
 3 const int maxn=100005;
 4 int n;
 5 int a[maxn];
 6 long long ans=0;
 7 int t[maxn];
 8 void count(int* A,int x,int y)
 9 {
10     if(x+1<y)
11     {
12         int m=(x+y)/2;
13         count(A,x,m);
14         count(A,m,y);
15         int p=x,q=m;
16         int i=x;
17         while(p<m||q<y)
18         {
19             if(q>=y||(p<m&&A[p]<=A[q]))
20             t[i++]=A[p++];
21             else
22             {
23                 t[i++]=A[q++];
24                 ans+=m-p;
25             }
26         }
27               for(int i=x;i<y;i++) A[i]=t[i];
28     }
29 }
30 int main()
31 {
32     cin>>n;
33     for(int i=0;i<n;i++) cin>>a[i];
34     count(a,0,n);
35     cout<<ans<<endl;
36     return 0;
37 }

关于归并排序的代码实现原理以及求逆序对的原理将在后续补充。

利用归并排序求逆序对数

原文:https://www.cnblogs.com/aininot260/p/9305880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!