算法:荷兰国旗问题
什么是荷蘭國旗問題
荷蘭國旗是由紅白藍3種顏色的條紋拼接而成,如下圖所示:
假設這樣的條紋有多條,且各種顏色的數量不一,并且隨機組成了一個新的圖形,新的圖形可能如下圖所示,但是絕非只有這一種情況:
需求是:把這些條紋按照顏色排好,紅色的在上半部分,白色的在中間部分,藍色的在下半部分,我們把這類問題稱作荷蘭國旗問題。
我們把荷蘭國旗問題用數組的形式表達一下是這樣的:
給定一個整數數組,給定一個值K,這個值在原數組中一定存在,要求把數組中小于K的元素放到數組的左邊,大于K的元素放到數組的右邊,等于K的元素放到數組的中間,最終返回一個整數數組,其中只有兩個值,分別是等于K的數組部分的左右兩個下標值。
例如,給定數組:[2, 3, 1, 9, 7, 6, 1, 4, 5],給定一個值4,那么經過處理原數組可能得一種情況是:[2, 3, 1, 1, 4, 9, 7, 6, 5],需要注意的是,小于4的部分不需要有序,大于4的部分也不需要有序,返回等于4部分的左右兩個下標,即[4, 4]
實現
思路
我們以上面舉的例子來看看處理過程的圖示:
- less 用于記錄小于 4 的區域的右下標,初始為-1,表示不存在小于4的
- more 用于記錄大于 4 區域的左下標,初始為9,表示不存在大于4的
- L 用于正在遍歷的元素的下標,初始值為0
從 arr[L] 即 arr[0] 開始遍歷數組- 如果 arr[L] < 4, 交換 arr[++ less] 和 arr[L++] 的值
- ++less:小于4的元素增加一個,L就是最右邊的索引
- L++:將正在遍歷的那個元素放置到[小于4區間的最右邊],然后接著進行下一輪比較
- 如果 arr[L] > 4, 交換 arr[–more] 和 arr[L] 的值
- –more:大于4的最左邊的那個元素的索引
- L不變是因為下一輪還要比較交換過來的元素, L++
- 如果 arr[L] = 4, 不交換,L++,直接遍歷下一個值
- 當 L >= more,退出循環。
- 如果 arr[L] < 4, 交換 arr[++ less] 和 arr[L++] 的值
參考
總結
- 上一篇: 快排及荷兰国旗问题
- 下一篇: 小Z解读:企业证书利用itms-serv