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--;
?}