算法—數(shù)組:荷蘭國旗問題

tips:本文章內(nèi)容來自《程序員編程藝術(shù):面試和算法心得》

給定一個(gè)字符串里面只有"R" "G" "B" 三個(gè)字符,請排序,最終結(jié)果的順序是R在前 G中 B在后。
要求:空間復(fù)雜度是O(1),且只能遍歷一次字符串。

只是需要用到三個(gè)指針:一個(gè)前指針begin,一個(gè)中指針current,一個(gè)后指針end,current指針遍歷整個(gè)數(shù)組序列,當(dāng)

current指針?biāo)冈貫?時(shí),與begin指針?biāo)傅脑亟粨Q,而后current++,begin++ ;

current指針?biāo)冈貫?時(shí),不做任何交換(即球不動(dòng)),而后current++ ;

current指針?biāo)冈貫?時(shí),與end指針?biāo)傅脑亟粨Q,而后,current指針不動(dòng),end-- 。


參考代碼:

/**

*荷蘭國旗問題

*/

void helanguoqi (char* str,unsigned long length){

? ? ? if(NULL== str || 0== length)

? ? ? ? ? ? ? ? return;

? ? ? char* strBegin = str;

? ? ? char* strCurrent = str;

? ? ? char* strEnd = str+length-1;

? ? ? while(strCurrent < strEnd) {

? ? ? ? ? ? ? if('R' == *strCurrent) {

? ? ? ? ? ? ? ? ? ?swap(*strBegin, *strCurrent);

? ? ? ? ? ? ? ? ? ?strBegin++;

? ? ? ? ? ? ? ? ? ?strCurrent++;//仔細(xì)想想為什么這里可以++

? ? ? ? ? ? ? ?}elseif('G' == *strCurrent){

? ? ? ? ? ? ? ? ? ? ? ? strCurrent++;

? ? ? ? ? ? ? ?}else{?

? ? ? ? ? ? ? ? ? ? ? ? swap(*strCurrent, *strEnd);

? ? ? ? ? ? ? ? ? ? ? ? strEnd--;

?}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容