基于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 个元素的双调序列。

 

点击此处下载文档和源码

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值