日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快排-荷兰国旗

發布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快排-荷兰国旗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在使用partition-exchange排序算法時,如快速排序算法,我們會遇到一些問題,比如重復元素太多,降低了效率,在每次遞歸中,左邊部分是空的(沒有元素比關鍵元素小),而右邊部分只能一個一個遞減移動。結果導致耗費了二次方時間來排序相等元素。這時我們可以多分一個區,即,小于區,等于區,大于區。(傳統快排為小于區和大于區)

?

下面我們通過一個經典例題來練習這種思想。

荷蘭國旗問題

”荷蘭國旗難題“是計算機科學中的一個程序難題,它是由Edsger Dijkstra提出的。荷蘭國旗是由紅、白、藍三色組成的。

? ? ??

  現在有若干個紅、白、藍三種顏色的球隨機排列成一條直線。現在我們的任務是把這些球按照紅、白、藍排序。

樣例輸入

3 BBRRWBWRRR RRRWWRWRB RBRW

樣例輸出

RRRRRWWBBB RRRRRWWWB RRWB

思路:

現在我們的思路就是把未排序時前部和后部分別排在數組的前面和后面,那么中部自然就排好了。

設置兩個標志位head指向數組開頭,tail指向數組末尾,now從頭開始遍歷:

(1)如果遍歷到的位置為1,那么它一定是屬于前部,于是就和head交換值,然后head++,now++;

(2)如果遍歷到的位置為2,說明屬于中部,now++;

(3)如果遍歷到的位置為3,說明屬于后部,于是就和tail交換值,然而,如果此時交換后now指向的值屬于前部,那么就執行(1),tail--;

廢話不多說,上代碼。

#include<iostream> #include<algorithm> using namespace std;const int maxn = 100 + 5;int n; string str; int main(){cin>>n;while(n--){cin>>str;int len=str.size();int now=0,ans=0;int head=0,tail=len-1;while(now<=tail){if(str[now]=='R'){swap(str[head],str[now]);head++;now++;}else if(str[now]=='W'){now++;}else{swap(str[now],str[tail]);tail--;}}cout<<str<<endl;}return 0; }

其實只要解題的話統計三個數量就好了,但是分三區的思想一定要有。

快排分三區以后降低了遞歸規模,避免了最差情況,性能得到改進。

總結

以上是生活随笔為你收集整理的快排-荷兰国旗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。