Three-Way-Partition
荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:
假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:
需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。
我们把荷兰国旗问题用数组的形式表达一下是这样的:
给定一个整数数组,给定一个值 Key,这个值在原数组中一定存在,要求把数组中小于 Key 的元素放到数组的左边,大于 Key 的元素放到数组的右边,等于 Key 的元素放到数组的中间,最终返回一个整数数组,其中只有两个值,分别是等于 Key 的数组部分的左右两个下标值。
思考
对于如下数组,我们如何在 O ( n ) O(n) O(n) 的时间完成三分法?

假设对于数组 a a a ,
红色区域: a [ 0 ] , a [ 1 ] , . . , a [ l e s s ] a[0],a[1],..,a[less] a[0],a[1],..,a[less] 为小于 k e y key key 的部分
白色区域: a [ l e s s + 1 ] , a [ l e s s + 2 ] , . . , a