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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

荷兰国旗排序问题

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

荷蘭國旗問題

問題可以抽象為:將一個數組依次分成三個子序列,要求三個子序列按一定順序排列,每個子序列中元素相同。

算法思想

借助快速排序的分治思想,前后同時遍歷,遇到逆序交換元素。將紅色條塊交換到前面,藍色條塊交換到最后面,白色位于紅藍之間。

為三個子序列設置三個移動變量(i,j,k),第二個子序列是排序的關鍵,因為當從前往后遍歷整個數組時,我們必須聚焦到第二個子序列的移動變量,i必須小于等于j,j必須小于等于k根據j指向元素的顏色,決定將其交換到前部還是尾部。i之前的元素為紅色,i,j之間的元素為白色;k之后為藍色。

實現代碼

typedef enum{RED,WHITE,BLUE} color;//設置枚舉數組 void Flag_Arrange(color a[],int n){int i=0,j=0,k=n-1;while(j<=k){switch(a[j]){case RED:{//不考慮交換后a[j]不為白色,是因為明確知道a[i],a[j]是什么顏色,a[i]為白,a[j]為紅Swap(a[i],a[j]);i++;j++;break;}case WHITE:0{Swap(a[i],a[j]);j++;break;}case BLUE:{//這里沒有j++語句以防止交換后a[j]不為白色的情況Swap(a[k],a[j]);k--;}}} }

總結

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

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