[源码和文档分享]基于C++实现的双调排序算法

1 算法描述

双调排序的基本概念有两个:双调序列和 Batcher 定理。

双调序列:双调序列是由两个单调性相反的非严格单调序列构成的序列(非严格指的是可以出现重复元素,或者NaN不参与排序)。比如(23, 10, 8, 3, 5, 7, 7, 8)。当序列满足以下两种情况时,它是双调序列:

  • 存在一个ak(1 ≤ k ≤ n),使得a1 ≥..≥ ak ≤..≤ an成立。

  • 序列能偶循环位移满足条件1

Batcher 定理:将任意一个长为 2n 的双调序列 A 分为等长的两半 X 和 Y,将 X 中的元素与 Y 中的元素一一按原序比较,即a[i]与a[i + n] (i < n)比较,将较大者放入 MAX 序列,较小者放入 MIN 序列。则得到的 MAX 和 MIN 序列仍然是双调序列,并且 MAX 序列中的任意一个元素不小于MIN 序列中的任意一个元素。

读过( https://blog.csdn.net/u014226072/article/details/56840243 )和( https://blog.csdn.net/hanshuning/article/details/49132089 )两位笔者的代码和思路后,总结算法基本过程主要有两步,首先将输入的无序的序列转化成双调序列,然后将得到的双调序列进行双调合并即可得到最终解。

具体思路:对于任意两个元素x,y,无论x ≥ y 或 x ≤ y,序列(x,y)均为双调序列。因此任何无序的序列都是由若干个二元有序的双调序列连接而成的。于是,对于一个无序序列我们按照递增和递减顺序合并相邻的双调序列,按照双调序列的定义,通过连接递增和递减序列得到的序列是双调的。最终,我们可以将若干个只有 2 个元素的双调序列合并成 1 个有 n 个元素的双调序列。


参考文档和完整的文档和源码下载地址:

https://www.write-bug.com/article/1528.html

猜你喜欢

转载自blog.csdn.net/demongwc/article/details/85028487
今日推荐