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