基於快排思想的題目(一)——荷蘭旗問題
快排的實現大家估計都知道,主要就是乙個partition和交換的過程。這個思想其實是很巧妙的,基於此,很多題目都可以用它來很好地解決。這篇我們講到了註明的荷蘭旗問題,就是可以用到快排的思想~後續還有一系列的題目,應該都是可以用到快排思想的,後面慢慢整理ing~
這個題目是由荷蘭科學家dijkstra提出來的,首先輸入亂序排列的三色小球(紅,白,藍),如果通過兩兩交換,使得所有紅色小球排在前面,白色小球排在中間,藍色小球排在最後~
使用快排的思想,我們先用3個指標head, middle, tail。初始時,head和middle指向第乙個球,tail指向最後乙個球。然後移動和交換的規則如下:
(0表示紅,1表示白,2表示藍)
直到current>tail, 停止移動。
其實我們可以理解到:當middle指向0的時候,這個0應該是在前面的,所以說我們需要把它和head交換,交換之後自然head++,middle++,因為此時已經保證了head前面的都是0了;後面當middle指向2的時候,和上面原因一樣,我們需要和tail交換,交換了之後只要把tail--,當時middle不要動,因為交換之後的數值我們還不知道情況呢,我們需要進一步判斷。
移動的圖示如下:
**如下:
#includeusing namespace std;
void dutchflag(int *a, int head, int middle, int tail)
if(a[middle]==1)
middle++;
if(a[middle]==2)
}}int main()
; int num=10;
for(int i=0; i
基於快排思想的第 前 k大 小
演算法思路就是根據快排的partition,先隨機選擇乙個分隔元素 或a 0 將陣列分為 小於a p 的元素 a p 大於a p 的元素 如果這時候n p 1等於k的話,a p 就是所求的第k大,否則如果n p 1 k,那麼說明第k大元素應該是在 大於a p 的元素 裡,所以再partition這部...
由荷蘭國旗問題推導出的快排
快排引出的荷蘭國旗問題 void swap int a,int b 乙個問題的寫法有很多,怎麼想就怎麼寫,結果都是一樣的 void func int a,int l,int r else if a l a r else swap a r a more includeint main int c si...
尋找第K大的數(快排思想)
使用快排思想找第k大的數,演算法複雜度o n 1.以陣列a的第0位a 0 為參考基準base,將陣列劃分為兩個部分 如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準b...