C++全排列實現代碼

jopen 9年前發布 | 2K 次閱讀 C/C++

思路1——全排列的遞歸實現核心思想:

比如對于字符串”abc”,

第一步:求所有可能出現在第一個位置的字符即:a,b,c。

使用方法:把第一個字符和后面的b、c字符進行交換。

第二步:把第一個字符后面的所有字符仍然看成兩部分,即后面的第一個字符及除此之外的其他字符。然后完成后面的第一個字符與其他字符的交換。比如:第2個位置的b與第3個位置c的交換。

第三步:依次遞歸,直到末尾的’\0’為止。

static int g_sCnt= 0;

//permutation的重載版本. voidpermutation(char pStr, char pBegin) { if(pBegin == '\0') { ++g_sCnt; cout << pStr << endl; } else { for(char pCh = pBegin; pCh != '\0'; ++pCh) { //從第一個字符依次和后面的字符進行交換. char temp = pCh; pCh = pBegin; *pBegin = temp;

                 permutation(pStr,pBegin+1);

                 //交換回原樣,以便再遞歸處理后面的字符.
                 temp = *pCh;
                 *pCh = *pBegin;
                 *pBegin = temp;

          }//end for
   }//end else

} //全排列處理函數 voidpermutation(char* pStr) { if(pStr== NULL) { return; } else { permutation(pStr,pStr); } }

int main() { char strSrc[] = "abcd"; permutation(strSrc); cout<< "共 " << g_sCnt << " 種排列!" <<endl;

return 0; } </pre>
思路2——全排列的STL實現:

有時候遞歸的效率使得我們不得不考慮除此之外的其他實現,很多把遞歸算法轉換到非遞歸形式的算法是比較難的,這個時候我們不要忘記了標準模板庫STL已經實現的那些算法,這讓我們非常輕松。

STL有一個函數next_permutation(),它的作用是如果對于一個序列,存在按照字典排序后這個排列的下一個排列,那么就返回true且產生這個排列,否則返回false。

注意,為了產生全排列,這個序列要是有序的,也就是說要調用一次sort。

實現很簡單,我們看一下代碼:

void permutation(char* str)
{
       int length = strlen(str);

   //第1步:排序
sort(str,str+length);

   //第2步:調用函數next_permutation
do
{
    for(int i=0; i<length; i++)
          {
                 cout<<str[i];
          }
    cout << endl;
}while(next_permutation(str,str+length));

}

int main() { char str[] = "acb"; permutation(str);

return 0;

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!