博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求排列的逆序数(分治)
阅读量:5906 次
发布时间:2019-06-19

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

一个排列含有逆序的个数称为这个排列的逆序数。例如排列263451含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。
例题: 求排列的逆序数
笨办法: O(n2)
分治O( nlogn) :
1) 将数组分成两半,分别求出左半边的逆序数和右半边的逆序数
2) 再算有多少逆序是由左半边取一个数和右半边取一个数构成(要求O(n)实现)
2) 的关键: 左半边和右半边都是排好序的。比如,都是从大到小排序的。这样,左右半边只需要从头到尾各扫一遍,就可以找出由两边各取一个数构成的逆序个数
 
#include 
using namespace std;void Merge(int a[],int s,int mid,int e,int tmp[]){ int p1=s,p2=mid+1,p3=0; while(p1<=mid && p2<=e) { if(a[p1]>=a[p2]) tmp[p3++]=a[p1++]; else tmp[p3++]=a[p2++]; } while(p1<=mid) tmp[p3++]=a[p1++]; while(p2<=e) tmp[p3++]=a[p2++]; int cnt=0; for(int i=s; i<=e; i++) a[i]=tmp[cnt++];}int MergeSortCount(int a[],int s,int e,int tmp[]){ int result=0; if(s

转载于:https://www.cnblogs.com/zhanyeye/p/9746102.html

你可能感兴趣的文章
字体图标学习
查看>>
局域网网速变慢的故障细致分析
查看>>
oracle 远程tns配置
查看>>
虚拟桌面带宽评估
查看>>
一起学shell(十一)之安全的shell脚本:起点
查看>>
Microsoft® Deployment Toolkit 2010之快速部署Windows 7
查看>>
LNMP的技术讲解
查看>>
SVN Hooks的介绍及使用
查看>>
Oracle 字符集的查看和修改【上】
查看>>
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
转 ubuntu解压命令全览
查看>>
Android开发的前景分析——之你为何看好Android?
查看>>
linux学习笔记
查看>>
页面自动刷新
查看>>
No free lunch in search and optimization
查看>>
分析 Spring 的编程式事务管理及声明式事务管理(转)
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>