T618763 荷兰国旗问题
题目背景
“荷兰国旗问题”(Dutch National Flag Problem)是由 Dijkstra 提出的一个经典的一趟划分(one-pass partition)算法,核心思想是把只包含三种可能取值的数组,原地划分成三段——小于、等于、大于主元(pivot)。
题目描述
给定长度为 $n$ 的数组 $a[0..n-1]$,其中每个元素只可能是三种颜色中的一种(通常用数字 `0`,`1`,`2` 表示)。要求原地(in-place)、一次遍历(one-pass)后,把所有 `0` 放到最左边,所有 `1` 放中间,所有 `2` 放右边。
输入格式
* **输入**:一个只含 $\{0,1,2\}$ 的数组 $a$。
首先输入 $n$ 代表这个数组有 $n$ 个元素。然后输入这个 $n$ 个元素 $a_i$
$1
输出格式
* **输出**:重排后的数组,使得
$$
[\underbrace{0,0,\dots,0}_{\text{所有0}} \;|\; \underbrace{1,1,\dots,1}_{\text{所有1}} \;|\; \underbrace{2,2,\dots,2}_{\text{所有2}}]
$$
说明/提示
* **关键点**:一次遍历、原地交换。
* **适用场景**:除了 $\{0,1,2\}$ 的情况,只要把等于基准看成1,小于基准看成0,大于基准看成2,也可以用于快速排序中对含大量重复元素的优化(三路划分快排)。