我理解3种颜色的DNF问题。假设我想将颜色数量扩展到5(0,1,2,3,4),我还能获得O(n)复杂度吗?
所以我认为我们有5个区域,其中2个是未知区域。但是如何实现呢?我可以轻松地将3种颜色的算法扩展到5吗?
void sort012(int a[], int arr_size){
int lo = 0;
int hi = arr_size - 1;
int mid = 0;
while (mid <= hi){
switch (a[mid]){
case 0:
swap(&a[lo++], &a[mid++]);
break;
case 1:
mid++;
break;
case 2:
swap(&a[mid], &a[hi--]);
break;
}
}
}
答案 0 :(得分:0)
绝对是O(n)
:只要颜色O(nk)
的数量不变,就可以在k
中轻松实现。
对于类似于三向分区(Dutch National Flag problem)的算法,我建议采用双遍算法。例如,在第一遍中,我们将0
视为左侧部分,将1
,2
和3
全部视为中间部分,{{1}作为正确的部分。在第二遍中,我们会跳过边框处的4
和0
s,并对4
s,1
和{{1}进行三向分区}}秒。请注意,结果是一个稳定的分区:在每次传递时,相同元素的顺序保持不变。