转载请注明:http://www.cnblogs.com/StartoverX/p/4283186.html

题目:给出一个确定在n个不同元素的任何排列中逆序对数量的算法,最坏情况需要Θ(nlgn)时间。(提示:修改归并排序。)

思路:修改从大到小排序的归并排序。

  归并排序分为三步:分解、解决、合并。

  分解:将排列A分解为A1、A2两个子排列。

  解决:递归的从大到小排列A1和A2,在此同样递归的求解A1、A2的逆序对数量。

  合并:按照递归排序的合并策略从大到小比较A1中的元素[a1,a2,a3…]和A2中的元素[b1,b2,b3…]。

      1.若a1大于b1,则a1大于A2中的所有元素,逆序对的数量加上length(A2),将a1从A1中移至输出排列,a2继续与b1比较。

      2.若a1小于b1,则b1大于A1中的所有元素,b1不能与A1中的元素构成逆序对,将b1从A2中移至输出排列,b2继续与a1比较。

      3.直到A1或A2中没有元素,将剩余元素移至输出排列。

    合并后的逆序对的数目为合并前A1和A2中逆序对的数目之和加上合并过程中加上的逆序对数。

#include<iostream>
using namespace std; int A[];
int temp1[];
int temp2[];
int merge(int low1,int high1,int low2,int high2){//合并步
int inver_num=;//合并中新增的逆序对数目。
int A_pos=low1;
int size1=;//首先将两个待合并数组复制到临时数组中。
while(low1<=high1){
temp1[size1++]=A[low1++];
}
int size2=;
while(low2<=high2){
temp2[size2++]=A[low2++];
}
int i=,j=;
while(size1!=&&size2!=){//开始合并
if(temp1[i]>temp2[j]){
A[A_pos++]=temp1[i++];
inver_num+=size2;//逆序对数目增加。
size1-=;
}
else{//没有相同元素。
A[A_pos++]=temp2[j++];
size2-=;
}
} while(size2!=){//将剩余的元素复制到输出数组。
A[A_pos++]=temp2[j++];
size2-=;
}
while(size1!=){//和上面的while只会执行一个。
A[A_pos++]=temp1[i++];
size1-=;
}
return inver_num;
}
int inversion(int low,int high){
if(low>=high)
return ;
int mid=(low+high)/;
int left_num=inversion(low,mid);
int right_num=inversion(mid+,high);
int merge_num=merge(low,mid,mid+,high);
return left_num+right_num+merge_num;
} int main(){
int size;
cin>>size;//输入数组大小。
for(int i=;i<size;i++){//输入数组。
cin>>A[i];
}
cout<<inversion(,size-)<<endl;
}

[算法导论]练习2-4.d求排列中逆序对的数量的更多相关文章

  1. 求数组中的逆序对的数量----剑指offer36题

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...

  2. openjudge 7622 求排列的逆序数(归并)

    7622:求排列的逆序数 总时间限制:  1000ms   内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她) ...

  3. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)

    题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...

  4. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  5. 算法导论2-4 O(nlgn)时间复杂度求逆序对

    def mergesort(nums,le,ri): if le>ri-2: return 0 mi=le+(ri-le)//2 a=mergesort(nums,le,mi) b=merges ...

  6. 洛谷 P1521 求逆序对

    题目描述 我们说(i,j)是a1,a2,…,aN的一个逆序对当且仅当i<j且ai>a j.例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4).现在已知N和K,求 ...

  7. 归并排序求逆序对(poj 2299)

    归并排序求逆序对 题目大意 给你多个序列,让你求出每个序列中逆序对的数量. 输入:每组数据以一个数 n 开头,以下n行,每行一个数字,代表这个序列: 输出:对于输出对应该组数据的逆序对的数量: 顺便在 ...

  8. 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

  9. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

随机推荐

  1. 比如在vi中按ctrl+z

    比如在vi中按ctrl+z有个命令可以恢复会话,我忘了,大家谁记得?   分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报| 编辑 删除 管理 回复次数:8   hellwolf hellwo ...

  2. jQuery 弹出div层

    目的:使用jQuery弹出一个div窗口:这种效果经常应用于页面内容的展示,登录效果的实现.其实,实现这种效果有好多种方式: 效果如下: 代码如下: <html> <head> ...

  3. cf494A Treasure

    A. Treasure time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  4. linux下,FTP服务相关

    虚拟机上安装完CentOS 6.5后,使用FTP工具(FlashFXP)来上传文件到虚拟机的linux,结果发现连接不上.现在解决了,解决方法总结一下: 1.先检查有没有安装ftp.好像包括两个部分, ...

  5. 九度OJ 1437 To Fill or Not to Fill

    题目大意:小明从杭州去往某目的地,要经过一些加油站,每个加油站的价格不一样.若能顺利到达,求加油费用最少为多少,否则求出能行驶的最远距离. 思路:贪心算法 1>若下一加油站的价格更便宜,则只需走 ...

  6. POJ1061青蛙的约会(扩展欧几里德算法)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 102239   Accepted: 19781 Descript ...

  7. Java中的XML操作

    1.DOM方式解析(读取)XML文件 待解析(读取)的XML文件,直接放在项目根目录下即可 <?xml version="1.0" encoding="UTF-8& ...

  8. python turtle,random,math

    # List imports here: import turtle import random import math # List constants here (NO MAGIC NUMBERS ...

  9. python中os模块常用方法

    #!/usr/bin/python## os module test import os print 'os.name: ', os.nameprint 'os.getcwd(): ', os.get ...

  10. junit4测试 Spring MVC注解方式

    本人使用的为junit4进行测试 spring-servlet.xml中使用的为注解扫描的方式 <?xml version="1.0" encoding="UTF- ...