分治法求一个N个元素数组的逆序数
来源:互联网 发布:四川麻将血战定缺算法 编辑:程序博客网 时间:2024/06/05 11:14
转自:http://www.cnblogs.com/ChrisLi/p/3798858.html
分治法求一个N个元素数组的逆序数
背景
逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
定义
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。
问题求解
分治法求逆序数相当于在归并排序的过程中加上相应的逆序数的数目。
假设数组A被划分成前半部分(A[left]->A[mid]),后半部分(A[mid+1],A[right])
假设前半部分与后半部分各自都是从小到大排好序的,若A[left]<A[mid+1]那么由A[mid+1]这个数与数组前半部分造成的逆序数目是mid-left+1,这个数在接下来的逆序数中不用再考虑,反之类同。
使用分治法解决该问题的时间复杂度为O(N*log(N)).
代码如下:
1 #include<iostream> 2 #include<conio.h> 3 using namespace std; 4 int merge(int *A,int left,int mid,int right){ 5 int *temp=new int[right-left+1]; 6 int num=0; 7 int i=left; 8 int j=mid+1; 9 int k;10 int index=0;11 for(;i<=mid&&j<=right;){12 if(A[i]>A[j]){13 num+=mid-i+1;14 temp[index]=A[j];15 j++;16 }17 else{18 temp[index]=A[i];19 i++;20 }22 index++;23 }24 //i=mid的时候,A[i]位置的数还未填充到数组temp中25 //因此判断条件包含等于号26 if(i<=mid)27 for(;i<=mid;i++){28 temp[index]=A[i];29 index++;30 }32 if(j<=right)33 for(;j<right;j++){34 temp[index]=A[j];35 index++;36 }3738 for(k=0;k<right-left+1;k++)39 A[left+k]=temp[k];40 41 delete []temp;42 return num;43 }45 int inversion(int *A,int left,int right){46 if(left>=right)47 return 0;48 int mid=(left+right)/2;49 int num1=inversion(A,left,mid);50 int num2=inversion(A,mid+1,right);51 return num1+num2+merge(A,left,mid,right); 54 }55 int main()56 {57 int A[5]={9,8,7,6,5};58 cout<<inversion(A,0,4)<<endl;59 _getch();60 }
0 0
- 分治法求一个N个元素数组的逆序数
- 分治方法实现求一个数组的逆序数
- 分治法的应用-求逆序数
- 分治法 求 逆序数
- 分治法求逆序数
- 分治法求逆序数
- 树状数组与分治法求逆序数
- 分治算法 求数组逆序数
- 分治求逆序数
- 分治法求整数序列的逆序数
- 求逆序数的分治算法
- 求逆序数的分治算法
- 分治之求排列的逆序数
- 算法导论9.3-8-设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数
- 一个具有N个元素的数组,找出数组中的第二大的数
- 求数组中的逆序对 分治法
- 求数组的逆序数
- 求数组的逆序数
- NoSuchFieldError: No static field btn_press3 of type I in class Lcom/hyphenate/helpdesk/R$id; or its
- HighChart如何自行设置x轴的名字和加载多条折线
- 1.10. Decision Trees : sklearn.tree.DecisionTreeClassifier
- 自定义字符串排序
- CentOS6.5上Cloud Control 12c安装
- 分治法求一个N个元素数组的逆序数
- stupid coding
- minGW安装和配置
- linux/ubuntu常用bash/shell命令
- .一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- Ubuntu系统Spyder运行时kernel died问题
- SAP HANA index type
- 安装vmware tools中遇到的问题
- mysql 4