对于这篇讨论和这篇讨论所提及的排序,是否可以用双端队列的思想优化?
具体优化方案为:
1.仍用二维vector数组 q 与两个数组 head、tail,一个变量 p 进行队列模拟,初始时,head 与 tail 的元素和 p 全部设为0。另设一个数组 f 进行双端队列的标记。
2.输入元素。输入 a[i] 时,若 a[i]=a[i−1],直接入队,tail[p]←tail[p]+1。
3.输入 a[i] 时,若 a[i]>a[i−1],则判断 f[p] 是否为 0,若是,直接入队,tail[p]←tail[p]+1。若否,新建一个队列,p←p+1,tail[p]=1(这里 p 取自增后的 p,下同)。
4.输入 a[i] 时,若 a[i]<a[i−1],判断几种情况:
(1).f[p]=1,直接入队,tail[p]←tail[p]+1;
(2).f[p]=0,但是 tail[p]=1,直接入队,tail[p]←tail[p]+1,f[p]=1。
(3).f[p]=0,且 tail[p]=0,新建一个队列,p←p+1,tail[p]=1。
5.输入完成后,开始排序。定义变量 mn 记录最小值,若当前队列的 head>tail 则直接跳过,否则,若 f[i]=0,mn 与 head[i] 比较,否则与 tail[i] 比较,若当前元素小于 mn,mn=i。
6.比较出 mn 后,若 f[mn]=0,输出 q[mn][head[mn]],head[mn]←head[mn]+1。否则,输出 q[mn][tail[mn]],tail[mn]←tail[mn]−1。
运用这种思想能否进行时间复杂度优化?