荷兰红旗问题
設有一個僅由紅、白、藍三種顏色的條塊組成的條塊序列,請編寫一個時間復雜度為O(n)的算法,使得這些條塊按紅、白、藍的順序排好,即排成荷蘭國旗圖案。
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 typedef enum 6 { 7 RED, 8 WHITE, 9 BLUE 10 } color; //定義荷蘭國旗顏色枚舉數組 11 12 void flag_arrange(color sz[], int len) 13 { 14 // i以前全為紅色,k以后全為藍色,i和k中間 15 int i = 0, j = i, k = len - 1; 16 while (j <= k) 17 { 18 // 如果為紅色,則和i交換 19 if (sz[j] == RED) 20 swap(sz[i++], sz[j++]); 21 else if (sz[j] == BLUE) // 如果為藍色,則和k交換 22 swap(sz[k--], sz[j]); //這里沒有j++以防交換后仍為藍色的情況 23 else 24 j++; 25 } 26 } 27 int main() 28 { 29 // 定義一個荷蘭國旗數組 30 color a[] = {RED, WHITE, WHITE, BLUE, BLUE, RED, WHITE, BLUE, RED, RED, BLUE, WHITE}; 31 // 執行排序 32 flag_arrange(a, 12); 33 // 打印輸出排序結果 34 for (int i = 0; i < 12; i++) 35 printf("%d%c", a[i], i == 11 ? '\n' : ' '); 36 return 0; 37 }
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 typedef enum 6 { 7 RED, 8 WHITE, 9 BLUE 10 } color; //定義荷蘭國旗顏色枚舉數組 11 12 void flag_arrange(color sz[], int len) 13 { 14 // i以前全為紅色,k以后全為藍色,i和k中間 15 int i = 0, j = i, k = len - 1; 16 while (j <= k) 17 { 18 // 如果為紅色,則和i交換 19 if (sz[j] == RED) 20 swap(sz[i++], sz[j++]); 21 else if (sz[j] == BLUE) // 如果為藍色,則和k交換 22 swap(sz[k--], sz[j]); //這里沒有j++以防交換后仍為藍色的情況 23 else 24 j++; 25 } 26 } 27 int main() 28 { 29 // 定義一個荷蘭國旗數組 30 color a[] = {RED, WHITE, WHITE, BLUE, BLUE, RED, WHITE, BLUE, RED, RED, BLUE, WHITE}; 31 // 執行排序 32 flag_arrange(a, 12); 33 // 打印輸出排序結果 34 for (int i = 0; i < 12; i++) 35 printf("%d%c", a[i], i == 11 ? '\n' : ' '); 36 return 0; 37 }
?
轉載于:https://www.cnblogs.com/sqdtss/p/10738575.html
總結
- 上一篇: QuickChm出现的“不支持此接口”错
- 下一篇: android JeckPack官方文档