一种在线性时间内对数组进行排序的算法

我正在阅读Skiena的算法设计手册,但无法解决这个问题.

假设数组A由n个元素组成,每个元素都是红色,白色或蓝色.我们
寻求对元素进行分类,以便所有的红色都出现在所有白色之前
在所有蓝调之前钥匙上唯一允许的操作是

Examine(A,i) { report the color of the ith element of A.
Swap(A,i,j) { swap the ith element of A with the jth element.

找到一种正确有效的红白蓝分选算法.有一个线性时间
解.

我尝试使用quicksort,在3个枢轴上,我应该能够解决它,但是当我看到重复快速排序时我不知道该怎么办.

最佳答案 保持两个指针:最初指向0的红色指针和指向数组最后一个元素的蓝色指针.

现在使用“检查”功能从左到右扫描阵列.

>每次遇到红色元素时,使用当前红色指针交换它(使用交换功能)并递增红色指针.
>同样,每次遇到蓝色元素时,将其与当前蓝色指针交换并减少蓝色指针.
>遇到白色元素时增加当前指针.
>当前指针穿过蓝色指针时停止.

现在应该根据需要对数组进行排序.

这是Dutch National Flag Problem.

点赞