【算法习作】荷兰国旗问题
1.問題描述:
???
我們將亂序的紅白藍三色小球排列成有序的紅白藍三色的同顏色在一起的小球組。這個問題之所以叫荷蘭國旗,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列后正好組成荷蘭國旗。
2.問題分析:
這個問題我們可以將這個問題視為一個數組排序問題,這個數組分為前部,中部和后部三個部分,每一個元素(紅白藍分別對應0、1、2)必屬于其中之一。由于紅、白、藍三色小球數量并不一定相同,所以這個三個區域不一定是等分的,也就是說如果我們將整個區域放在[0,1]的區域里,由于三色小球之間數量的比不同(此處假設1:2:2),可能前部為[0,0.2),中部為[0.2,0.6),后部為[0.6,1]。我們的思路如下:將前部和后部各排在數組的前邊和后邊,中部自然就排好了。具體的:
設置兩個標志位begin和end分別指向這個數組的開始和末尾,然后用一個標志位current從頭開始進行遍歷:
1)若遍歷到的位置為0,則說明它一定屬于前部,于是就和begin位置進行交換,然后current向前進,begin也向前進(表示前邊的已經都排好了)。
2)若遍歷到的位置為1,則說明它一定屬于中部,根據總思路,中部的我們都不動,然后current向前進。
3)若遍歷到的位置為2,則說明它一定屬于后部,于是就和end位置進行交換,由于交換完畢后current指向的可能是屬于前部的,若此時current前進則會導致該位置不能被交換到前部,所以此時current不前進。而同1),end向后退1。
3.解決代碼:
?
本文轉自gnuhpc博客園博客,原文鏈接http://www.cnblogs.com/gnuhpc/archive/2012/12/21/2828166.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的【算法习作】荷兰国旗问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ctfmon.exe是什么进程
- 下一篇: Rundll32.exe是什么?如何解决