Loading

【笔记】排序的第 ? 种方法——排序网络 / 【题解】「BalticOI 2021 Day2」The Collection Game

前言

早上写模拟赛被毒瘤题卡了 \(2\) 个小时,本以为是个 nb 思维题,没想到居然是个科技题(

正文

我们都知道排序可以分为 基于比较的排序基于值域的排序,也可以分为 稳定排序非稳定排序,当然也可以按时间复杂度分。

事实上,排序还可以分为基于数据的排序和不基于数据的排序,OI 中几乎所有的排序都是基于数据的排序。

如何评判一个排序是否基于数据?

首先我们只考虑基于比较的排序,桶排之类排除在外。如果一个排序的比较顺序和输入数据有关,那么就是基于数据的排序,否则就不是。

可能很难理解什么是与输入数据有关,举个例子。比如归并排序,当我们归并两个有序序列时,需要维护当前指针,而当前指针的移动与数据的分布有关。再比如快速排序,如果数据不同,则每次递归的长度也不同,比较自然也不相同。

相反,冒泡排序就是典型的不基于数据的排序。因为无论输入的数据是什么样的,我们比较的位置和顺序都是不变的。

对于不基于数据的排序,我们可以将整个排序过程画出一个固定的流程图,这张图也被称为排序网络。

上面就是冒泡排序的排序网络。不难发现如果两次比较不相交,则可以进行并行计算。而最少进行的并行计算次数,就是排序网络的层数。目前最优秀的排序网络能做到 \(\mathcal{O}(N\log^2N)\) 的比较次数,和 \(\mathcal{O}(\log^2)\) 层,如双调排序,奇偶归并等。

验证一个比较网络是否是排序网络是 NPC 问题,更多内容在 matrix67 的博客

题目

不知道这和 OI 没什么关联的 trick 居然真的能出成题目。

首先仔细模拟以下不难发现,直接排序,swap 操作并没有什么用。因为如果 swap 了,那么反馈的结果也会改变,对应的操作也会改变。

考虑 \(V\ge 500\),直接冒泡排序即可。如果是求序列最大值只用 \(\log N\) 次参观,每次我们将奇数和偶数位的比较并行计算即可。

对于 \(V\ge 100\)\(V\ge 50\) 分别对应层数为 \(\log^2 N\)\(\dfrac{\log^2N}{2}\) 的排序网络。

posted @ 2021-11-14 12:22  7KByte  阅读(170)  评论(0编辑  收藏  举报