現有紅白藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之
所以叫荷蘭國旗,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗
數字0:紅球;數字1:白球;數字2:籃球
思路:使用三個指標,乙個前指標begin,乙個中指標current,乙個後指標end。current指標遍歷整個陣列序列。
我們先來回顧一下快速排序:
快速排序時基於分治模式處理的,對乙個典型子陣列a[p...r]排序的分治過程為三個步驟:
1、分解:a[p..r]被劃分為倆個(可能空)的子陣列a[p ..q-1]和a[q+1 ..r],使得a[p ..q-1] <= a[q] <= a[q+1 ..r] ;
2、解決:通過遞迴呼叫快速排序,對子陣列a[p ..q-1]和a[q+1 ..r]排序;
3、合併。
也就是說,快速排序的主要思想便是依託於乙個partition分治過程,每一趟排序的過程中,選取的主元都會把整個陣列排列成一大一小的序列,繼而遞迴排序完整個陣列。
然後,我們再回來看看本題:
1、current指標指向元素0時,與begin指標所指向的元素交換,而後current++,begin++;2、current指標指向元素1時,current指1不做交換,然後current++;
3、current指標指向元素2時,與end指標所指向的元素交換,而後,如果current指標指向0時,current指標此刻不動,按照第一步執行;若current指標指向1,按第二步執行,且此時end--。在操作上可以直接使current指標不動,end--即可。
//荷蘭國旗
#include using namespace std;
//holland flag
void oddevensort(int *pdata, unsigned int length)
int *begin = pdata;
int *current = pdata;
int *end = pdata + length - 1;
while (current <= end)
if (*current == 1)
if (*current == 2)
}}int main()
; oddevensort(a, 10);
for (int i = 0; i < 10; i++)
cout << endl;
return 0;
}
荷蘭國旗問題
上方的便是乙個荷蘭國旗,從圖中我們可以很清楚的看出它的特點,它有三個區域組成,即紅,白,藍。好,現在我們的問題出來了。現在我們面前有一張桌子,桌子上整齊的擺放著紅色,白色,藍色三種線條,但他們的順序是凌亂的。我們的要求是 用乙個演算法把這些線條挑出來重新擺放順序,最後的結果就像上圖的荷蘭國旗,紅色在...
荷蘭國旗問題
問題 荷蘭國旗是由紅白藍三種顏色組成,現假設很多這三種顏色的線被打亂放置,要求從頭掃瞄一遍,3種顏色自然分開,顏色順序是紅,白,藍。問題分析 1 編碼 題目中有三種顏色,可以用0 紅,1 白,2 藍進行編碼。3 演算法 a 把n個0,1,2三種元素隨機放入陣列模擬很多這三種顏色的線被打亂放置的場景 ...
荷蘭國旗問題
荷蘭的國旗由紅色 白色和藍色3種顏色組成。現在假設有很多這3種顏色的線被存放在乙個陣列裡,要求每次操作僅能進行一次交換,在原陣列的基礎上操作。待對陣列進行一遍掃瞄後,3種顏色自然分開,顏色順序為紅 白 藍。另外,要求在o n 的複雜度下,是移動次數最少。荷蘭國旗問題 include include ...