荷兰国旗

时间:2018-05-16 13:16:20

标签: algorithm sorting dutch-national-flag-problem

我理解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;
    }
}
}

1 个答案:

答案 0 :(得分:0)

绝对是O(n):只要颜色O(nk)的数量不变,就可以在k中轻松实现。

对于类似于三向分区(Dutch National Flag problem)的算法,我建议采用双遍算法。例如,在第一遍中,我们将0视为左侧部分,将123全部视为中间部分,{{1}作为正确的部分。在第二遍中,我们会跳过边框处的40 s,并对4 s,1和{{1}进行三向分区}}秒。请注意,结果是一个稳定的分区:在每次传递时,相同元素的顺序保持不变。