逆序对的个数
来源:互联网 发布:百旺税控软件 编辑:程序博客网 时间:2024/05/22 03:48
对于数组A[1...n],若有i<j且A[i]>A[j],则对偶(i,j)称为A的一个逆序对。求数组中逆序对个数,很简单的思路是每个数和后面的数比较,这样需要(n^2)的时间,如果采用归并排序的思想最坏情况下需要O(nlgn)。
1.分解A[low...mid]和A[mid+1...high]
2.求解
3.合并,数组A[low...mid]和A[mid+1...high]分别都是有序的,设置两个指针,i指向mid,j指向high,如果A[i]>A[j],则A[i]>A[mid+1...high],所以逆序对的个数为j-(mid+1)+1,将A[i]放入数组tmp[]中,i前移;如果A[i]<A[j],将A[j]放入数组中,j前移。
#include<iostream>using namespace std;int MergeArry(int arry[],int low,int mid,int high){int i=mid,j=high;int k=0,count=0,tmp[100];while(i>=low&&j>mid){if(arry[i]>arry[j]){tmp[k++]=arry[i--];count+=j-mid;}elsetmp[k++]=arry[j--];}while(i>=low)tmp[k++]=arry[i--];while(j>mid)tmp[k++]=arry[j--];for(i=0;i<k;i++)arry[high-i]=tmp[i];return count;}int Inver(int arry[],int low,int high){int sum=0;if(low<high){int mid=(low+high)/2;sum+=Inver(arry,low,mid); //计算左边逆序对数sum+=Inver(arry,mid+1,high); //计算右边逆序对数sum+=MergeArry(arry,low,mid,high); //合并后的逆序对数}return sum;}int main(){int n,*arry,*tmp;cin>>n;arry=new int[n];for(int i=0;i<n;i++)cin>>arry[i];cout<<Inver(arry,0,n-1)<<endl;return 0;}
算法同上一篇相同
- 逆序对的个数
- 逆序对的个数
- 计算逆序对的个数
- 求逆序对的个数
- 求逆序对的个数(选择排序)
- 求数组中逆序对的个数
- 求数组的逆序对个数
- 归并排序与逆序对的个数
- 求数组中逆序对的个数
- hdu5273(区间逆序对的个数)
- 归并排序求逆序对的个数
- A1078. 逆序对个数
- 求逆序对个数
- 逆序对个数
- 求数组逆序对个数
- 数组解逆序对个数
- 求数组中的逆序对个数,并输出所以的逆序对
- 排序:查找数组中逆序对的个数
- linux下网络编程
- servlet 中注入 service 对象; 无需set 方法;
- Linux中断(interrupt)子系统之一:中断系统基本原理
- [Friends]S03E05
- PropertyChangeListener关联属性的简单介绍
- 逆序对的个数
- Oracle 10g 下载地址
- 黑马程序员_java静态的使用
- Beginning Jailbroken iOS Development – Your First Tweak
- 【STL】map
- VSS 2005使用
- 如何编程证明:当n是整数且n>2时,方程x^n+y^n=z^n无正整数解x,y,z
- JSP页面中输入的数据与数据库中取出的数据不相同?
- java连接数据库问题 求解答