1. 程式人生 > 其它 >【筆記】排序的第 ? 種方法——排序網路 / 【題解】「BalticOI 2021 Day2」The Collection Game

【筆記】排序的第 ? 種方法——排序網路 / 【題解】「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}\) 的排序網路。