分治法求一个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 }
转载于:https://www.cnblogs.com/ChrisLi/p/3798858.html
分治法求一个N个元素数组的逆序数相关推荐
- 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 Java代码
算法分析与设计作业-- 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 public class b1113 {static int min=Integer.MAX_VALUE;static ...
- c语言实现分治法求第K大元素(详细解释)
注:本文不对快速排序作任何解释,建议在对快速排序有一定了解后再阅览 一.问题分析 最简单的做法应该是直接选择先将集合排序(比如快速排序),然后直接以k为下标从有序集合中获取.但是这样做时间复杂度其实是 ...
- 采用分治法求一个整数序列中的最大值和最小值
#include <iostream> using namespace std; void MaxMin(int a[], int l, int r, int &maxe, int ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...
- python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...
分治法求众数 所属分类:数据结构 开发工具:C/C++ 文件大小:240KB 下载次数:3 上传日期:2018-01-04 20:19:09 上 传 者:九鼎 说明: 给定含有n个元素的多重集合S, ...
- c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...
分治法求众数 Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为 众数.例如,S={1,2,2,2,3,5}. ...
- 深大算法设计与分析实验二——分治法求最近点对问题
源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...
- 分治法求金块问题java_十、用分治法求金块问题.doc
十.用分治法求金块问题.doc PAGE PAGE 31 十.用分治法求金块问题: 老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块 ...
- c语言分治法求众数重数_分治法求众数问题 (配图)
标签: 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使 ...
最新文章
- 生成24位字符串ID__IdGenerator.java
- DWZ(J-UI)selectedToDo操作完成后刷新Tab
- SQL SERVER 2008 创建,删除,添加表的主键
- mysql 启动参数_MySQL启动相关参数 MySQL DBA学习
- centos7搭建SVN并配置使用http方式访问SVN服务器
- java list 排序_Java中List的排序
- java向应用程序传递参数_Java应用程序中的消息传递主体
- python导入自己写的py_卧槽,神操作!一句查询让Python帮忙自己写程序
- 使用shell/python获取hostname/fqdn释疑(转)
- 读Zepto源码之assets模块
- (day 21 - 辅助栈加模拟)剑指 Offer 31. 栈的压入、弹出序列
- python获取当前时间的源代码_python怎么获取当前系统时间
- python调用java完整教程
- 2021年下半年软考-网络工程师答案及解析(中级)
- 用Python网络爬虫来抓取网易云音乐歌词
- vs2015——拖动选项卡导致软件崩溃重启
- Spring Configuration Check Unmapped Spring configuration files found
- 微信朋友如何找回 android,微信怎么恢复好友?简单几步轻松恢复!
- HTML5实时显示摄像头视频
- 完全卸载nvidia驱动