1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | typedef enum color_e { RED, WHITE, BLUE, } color_t; int __partition(color_t arr[], int _start, int _end, color_t c) { int start = _start; int end = _end; while(start < end) { while(start <= end && arr[start] == c) start++; while(start <= end && arr[end] != c) end--; if(start<end) { color_t tmp = arr[start]; arr[start] = arr[end]; arr[end] = tmp; } } return start; } void partition(color_t arr[], int n) { __partition(arr, __partition(arr, 0, n - 1, WHITE), n - 1, BLUE); } bool check(color_t arr[], int n) { int i = 0; while(i < n && arr[i] == WHITE) i++; while(i < n && arr[i] == BLUE) i++; while(i < n && arr[i] == RED) i++; assert(i == n); return i == n; } void init(color_t arr[], int n) { int i = 0; color_t tmp_arr[3] = {WHITE, BLUE, RED}; while(i < n) { arr[i] = tmp_arr[rand()%3]; i++; } } int main() { srand(time(0)); int i = 1; for( ; i<100000; i++) { color_t * arr = new color_t[i]; init(arr, i); partition(arr, i); if(check(arr, i)) { printf("===================%d\n", i); } delete []arr; } } |
一个练手的程序,关键是快排中的partition。
一个数组中有红白蓝三种颜色,用线性的方法把这三种颜色分开。
我觉得直接调用qsort也肯定是线性的。
还可以统计一下三种颜色的数量,这样更简单,没啥意思。
December 12, 2011

我本科的算法课程考试,老师出的同样的题目
怀念当初啊
本科考啥,我都忘了。