归并排序及求逆序对

归并排序O(nlogn)及归并排序求逆序对数

归并排序及求逆序对

归并排序是一个以O(nlogn)时间复杂度进行排序的高级排序算法(相比较O(n^2)的低级排序来说)。以前只知道归并排序是一个可以并发的,可以用来进行外排序的算法,也知道它可以用来求逆序对。但是因为ACM中感觉平时使用快速排序就够了,求逆序对也可以使用权值线段树来做,所以对这个算法没有太在意。

今天看到了一道题,权值线段树开起来内存不够,也很代码量也有点大,于是今天学习了一下归并排序。看到代码发现非常好理解啊(当然我一次没写对233) 归并排序,简单的来说就是利用分治法,不断的把数组分到最小情况,然后再逐步向上合并。这里看起来有一点点像线段树的意思。 具体的看代码注释吧。

至于求逆序对,在归并排序的合并过程中,很容易发现每当我们将一个数字加入到临时数组中,都可以知道这个数字前面有多少个比它大的数字。这是因为我们合并的是两个相邻的数组,且这两个被合并的数组都是有序的。那么如果两个相邻的数组中,后面的数组的某个数字加入到了临时数组中,且前面的那个数组当前的数比被加入的这个数字大,那么可以知道前面的数组当前的数及其后面的所有数字都比被加入的这个数字大。

那么这时候我可以记录更新逆序对数。

参考资料:



本文标题:归并排序及求逆序对

文章作者:Xie Keyi

发布时间:2018年07月25日 - 18:07

原始链接:https://xiekeyi98.com/131f1863.html

许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 转载请保留原文链接及作者。