105.png

    1. /*
    2. 荷兰国旗问题:
    3. 这里要求时间复杂度为O(n),显然这是排序所无法完成的,所以我们需要另辟蹊径。
    4. 我们知道,快速排序的一次划分,可以以枢纽为界,左边均小于枢纽值,右边均大于枢纽值,
    5. 而这里恰好是三种颜色,我们用0代表红色,1代表白色,2代表蓝色,那么如果我们以1位枢纽,
    6. 进行一次快速排序的过程后,则可以达到要求,其因为我们仅仅遍历了一次数组,时间复杂度
    7. 为O(n)
    8. */
    9. #include <stdio.h>
    10. #include <stdlib.h>
    11. void swap(int &a, int &b) {
    12. int tmp;
    13. tmp = a;
    14. a = b;
    15. b = tmp;
    16. }
    17. void subQuick(int *arr, int len) {
    18. int left = 0, cur = 0, right = len-1;
    19. while (cur <= right) {
    20. if (arr[cur] == 2) {//等于2时放到最后,即与right交换
    21. swap(arr[cur], arr[right--]);
    22. }
    23. else if (arr[cur] == 0) {//等于0时放到最前,即与left交换
    24. swap(arr[cur++], arr[left++]);
    25. }
    26. else
    27. cur++;//等于1时不交换,直接下一个
    28. }
    29. }
    30. int main() {
    31. int arr[] = { 0,2,1,2,1,2,1 };
    32. subQuick(arr, 7);
    33. return 0;
    34. }