資料結構 全排列問題

2021-09-14 04:05:24 字數 1623 閱讀 6671

輸入乙個陣列,列印出該陣列中數字的所有排列。

例如輸入陣列123,則輸出由數字1、2、3 所能排列出來的所有字串

123、132、213、231、321 和312。

從集合中依次選出乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以123,為例

1為控制元素時,求23的排列;而在23中,2為控制元素;直到只剩下最後乙個資料,輸出123;

1位控制元素時,交換23的位置,在32中,3位控制元素;直到只剩下最後乙個資料,輸出132;

依次類推;

#include using namespace std;

templatevoid swap(type &a,type &b)

void perm(int *br,int k,int m)//k作為控制元素的陣列小標,所對應的資料作為排列的第乙個元素

如果不加第二個swap()函式的結果如下:

用以上的**完成122的全排列時,執行的結果並不如人意:

我們發現當序列中有重複的資料時,要省去不必要的交換;比如,序列122,第一次,第一位數和第二位數字交換得到212;第二次,需要第三位數字與第一位數字進行交換,而第二位數字與第三位數字相同,遇到這種情況就不需要交換。

解決全排列重複的規則——去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換。用程式設計的話描述就是第i個數與第j個數交換時,要求[i,j)中沒有與第j個數相等的數;**如下:

#include using namespace std;

templatevoid swap(type &a,type &b)

bool isswap(int *br,int begin,int end)//判斷是否交換

for(int i = begin; i < end;i++) }

return true;

}void perm(int *br,int k,int m)

cout << endl;

} else

} }}int main()

; int n = sizeof(ar)/sizeof(ar[0]);

perm(ar,0,n-1);

}

執行結果:

資料結構之字典序全排列

字典序法中,對於數字1 2 3 n的排列,不同排列的先後關係是從左到右逐個比較對應的數字的先後來決定的。例如對於5個數字的排列 12354和12345,排列12345在前,排列12354在後。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最後面的是 54321。字典序演算法如下 設p是...

資料結構 實現陣列全排列 c 實現

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。當n 1時,那乙個元素只有乙個全排列 當n 1時,考慮以下情況 int arr 對3個數進行全排列 先固定1,對2 3進行全排列 再固定2,對1 3進行全排列...

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...