博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分治法求一个N个元素数组的逆序数
阅读量:4993 次
发布时间:2019-06-12

本文共 1565 字,大约阅读时间需要 5 分钟。

背景

     逆序数:也就是说,对于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
2 #include
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)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<
<

 

 

转载于:https://www.cnblogs.com/ChrisLi/p/3798858.html

你可能感兴趣的文章
oracle权限
查看>>
java方法的虚分派和方法表
查看>>
【转】字符串和浮点数格式化输出小结
查看>>
Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求
查看>>
对测试人员或开发人员来说相互沟通有多重要?
查看>>
解释器、编译器以及他们之间的差别。
查看>>
MongoDB的快速手动安装
查看>>
JS制作简单的日历控件【JS Date对象操作实例演示】
查看>>
模板—树上倍增LCA
查看>>
高二小假期集训—D5
查看>>
EasyUI easyui-combobox 重复发送请求
查看>>
memcached-repcached
查看>>
[转]CentOS 5.3通过yum升级php到最新版本的方法
查看>>
UVA 11235 - Frequent values RMQ的应用
查看>>
大数据日志采集系统
查看>>
java 堆调优
查看>>
linux 安装JDK
查看>>
JAVA调用CMD命令
查看>>
weblogic的安装
查看>>
SSM框架中,controller的action返回参数给vue.js
查看>>