以排序(按字典順序)的順序在 C++ 中列印所有排列


在這個問題中,我們給定了一個長度為 n 的字串,我們必須以排序的順序列印該字串字元的所有排列。

讓我們舉個例子來理解這個問題

輸入:‘XYZ’

輸出:XYZ、XZY、YXZ、YZX、ZXY、ZYX。

在這裡,我們必須按照字典順序(字母順序升序)列印所有排列。

為了解決這個問題,我們必須先按字母順序升序排列陣列,排序後的陣列是排列的第一個元素。然後生成字串的下一個較高階排列。

下面的程式碼會讓你更清楚地理解解決方案

示例

 現場演示

#include<iostream>
#include<string.h>
using namespace std;
int compare(const void *a, const void * b){
   return ( *(char *)a - *(char *)b );
}
void swap(char* a, char* b) {
   char t = *a;
   *a = *b;
   *b = t;
}
int finduBound(char str[], char first, int l, int h) {
   int ubound = l;
   for (int i = l+1; i <= h; i++)
      if (str[i] > first && str[i] < str[ubound])
   ubound = i;
   return ubound;
}
void generatePermutaion ( char str[] ) {
   int size = strlen(str);
   qsort( str, size, sizeof( str[0] ), compare );
   bool isFinished = false;
   while ( ! isFinished ) {
      cout<<str<<"\t";
      int i;
      for ( i = size - 2; i >= 0; --i )
         if (str[i] < str[i+1])
            break;
         if ( i == -1 )
            isFinished = true;
      else {
         int ubound = finduBound( str, str[i], i + 1, size - 1 );
         swap( &str[i], &str[ubound] );
         qsort( str + i + 1, size - i - 1, sizeof(str[0]), compare );
      }
   }
}
int main() {
   char str[] = "NOPQ";
   cout<<"Permutation in Sorted order :\n";
   generatePermutaion(str);
   return 0;
}

輸出

Permutation in Sorted order :
NOPQ NOQP NPOQ NPQO NQOP NQPO
ONPQ ONQP OPNQ OPQN OQNP
OQPN PNOQ PNQO PONQ POQN
PQNO PQON QNOP QNPO QONP
QOPN QPNO QPON

更新於: 16-01-2020

460 次瀏覽

開啟你的 職業

完成課程並獲得認證

開始
廣告
© . All rights reserved.