博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求逆序对数总结 & 归并排序
阅读量:6034 次
发布时间:2019-06-20

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

用归并排序方式

最原始的方法的复杂度是O(n^2)。

使用归并排序的方式,可以把复杂度降低到O(nlgn).

 

设A[1..n]是一个包含N个非负整数的数组。如果在i〈 j的情况下,有A〉A[j],则(i,j)就称为A中的一个逆序对。

例如,数组(3,1,4,5,2)的“逆序对”有<3,1>,<3,2><4,2><5,2>,共4个。

 

注:我觉得方法是在归并过程中,记录每次归并,后面的分组中被放到了前面的元素的个数。

 

的确是这样的。下面这个也是MergeSort的基本算法框架:

 int gCount = 0;  template
int merge(Iterator begin, Iterator mid, Iterator end) { Iterator iL = begin; Iterator iR = mid; int count = distance(begin, end); vector
v(count); vector
::iterator it = v.begin(); while(iL != mid && iR != end) { if(*iL <= * iR) { *it++ = *iL++; } else { gCount += distance(iL, mid); *it++ = *iR++; } } if(iL == mid) copy(iR, end, it); if(iR == end) copy(iL, mid, it); copy(v.begin(), v.end(), begin); return 0;}template
int mergeSort(Iterator begin, Iterator end){ int count, step; count = distance(begin, end); if(count <= 1) { return 0; } step = count / 2; mergeSort(begin, begin + step); mergeSort(begin + step, end); merge(begin, begin + step, end); return 0;}

重点在 gCount += distance(iL, mid) (注:distance其实就是位置的减法)

逆序对数实质就是插入排序过程中要移动元素的次数。

要移动的元素的位数即第一个序列中还未插入到新序列中的元素的个数

即: distance(iL, mid)

转载于:https://www.cnblogs.com/charlesblc/p/5434787.html

你可能感兴趣的文章
CArray,CList,CMap如何实例化
查看>>
Jquery DataTable
查看>>
java将白色背景图片转换成无色
查看>>
Oracle 收集统计信息11g和12C在差异
查看>>
项目中phpexcel的基本用法
查看>>
ContextLoaderListener作用详解(转)
查看>>
优步司机端界面大改版,不会用搓这里!
查看>>
MapReduce整体架构分析
查看>>
spring mvc接收JSON格式的参数
查看>>
opencv的实用研究--分析轮廓并寻找边界点
查看>>
[React Testing] Redux Reducers
查看>>
微信web开发者工具
查看>>
Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
查看>>
REST服务介绍二
查看>>
【计算机基础】 经常使用的排序算法的时间复杂度和空间复杂度
查看>>
IOS中的多线程之GCD
查看>>
Sort Colors -- LeetCode
查看>>
Shell脚本中执行sql语句操作mysql
查看>>
intellij idea新建maven项目,一直loading archetype list.....
查看>>
下标的使用
查看>>