荷蘭國旗問題引出的三色排序
現在有若干個紅、白、藍三種顏色的球隨機排列成一條直線。現在我們的任務是把這些球按照紅、白、藍排序,就類似於荷蘭國旗一樣。
這個問題我們可以將這個問題視為一個陣列排序問題,這個陣列分為前部,中部和後部三個部分,每一個元素(紅白藍分別對應0、1、2)必屬於其中之一。
由於紅、白、藍三色小球數量並不一定相同,所以這個三個區域不一定是等分的,也就是說如果我們將整個區域放在[0,1]的區域裡,由於三色小球之間數量的比不同(此處假設1:2:2),可能前部為[0,0.2),中部為[0.2,0.6),後部為[0.6,1]。我們的思路如下:將前部和後部各排在陣列的前邊和後邊,中部自然就排好了。
具體方法如下:
設定兩個標誌位begin和end分別指向這個陣列的開始和末尾,然後用一個標誌位i從頭開始進行遍歷:
1)若遍歷到的位置為0,則說明它一定屬於前部,於是就和begin位置進行交換,然後i向前進,begin也向前進(表示前邊的已經都排好了)。
2)若遍歷到的位置為1,則說明它一定屬於中部,根據總思路,中部的我們都不動,然後i向前進。
3)若遍歷到的位置為2,則說明它一定屬於後部,於是就和end位置進行交換,由於交換完畢後i指向的可能是屬於前部的,若此時i前進則會導致該位置不能被交換到前部,所以此時i不前進。而同1),end向前進一。
具體程式碼如下:
class Solution {
public:
void sortColors(int A[], int n) {
int begin = 0;
int end = n-1;
int i = 0;
while(i<end+1)
{
if(A[i]==0)
{
swap(A[i], A[begin]);
begin++;
i++;
}
else if(A[i]==2)
{
swap(A[i], A[end]);
end--;
//i++;
}
else
i++;
}
}
};
相關文章
- 彩虹排序 | 荷蘭旗問題排序
- ACM 荷蘭國旗問題ACM
- 演算法學習-荷蘭國旗問題演算法
- 高頻面試考題:荷蘭旗問題面試
- 在連結串列上實現 Partition 以及荷蘭國旗問題
- 迴圈不變數之荷蘭國旗變數
- mysql 刪表引出的問題MySql
- SQL優化引出的問題(二)SQL優化
- SQL優化引出的問題(一)SQL優化
- 遠端執行緒注入引出的問題執行緒
- sql優化講課中引出的各種問題!SQL優化
- 由Java中的Set,List,Map引出的排序技巧Java排序
- 由“香蕉”引出的字串匹配演算法的問題字串匹配演算法
- python安裝MySQL庫引出的一些問題PythonMySql
- connect by 的排序問題排序
- Next.js-頁面重複渲染引出的水合問題JS
- 字串排序問題字串排序
- group by 排序問題排序
- Collections排序問題!!排序
- 中文排序 問題排序
- 一道題引出的Event LoopOOP
- 【CSS】孟加拉共和國國旗CSS
- 幾則小笑話引出的WEB使用者體驗問題Web
- 章節排序問題排序
- oracle中排序問題Oracle排序
- 面試題:陣列按列排序的問題面試題陣列排序
- 單連結串列的排序問題排序
- 這就是選擇排序的問題排序
- 分頁查詢的排序問題排序
- 索引無法消除排序的問題索引排序
- SQL SERVER和ORACLE的排序問題SQLServerOracle排序
- win7旗艦版網路上的芳鄰訪問問題Win7
- ERP實施經驗論談 IT界引出管理問題(轉)
- 荷蘭推出國家區塊鏈研究計劃區塊鏈
- iOS面試旗開得勝之問題篇iOS面試
- 紅旗linux 雙機問題解決Linux
- Array.sort排序問題排序
- python list 排序問題Python排序