全排列函式

2022-03-04 16:06:43 字數 2938 閱讀 8515

一、概念

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。如果這組數有n個,那麼全排列數為n!個。

比如a,b,c的全排列一共有3!= 6 種 分別是、、、、、。

二、常用操作

1.標頭檔案

#include
2.使用方法這裡先說兩個概念:「下乙個排列組合」和「上乙個排列組合」,對序列 ,每乙個元素都比後面的小,按照字典序列,固定a之後,a比bc都小,c比b大,它的下乙個序列即為,而的上乙個序列即為,同理可以推出所有的六個序列為:、、、、、,其中沒有上乙個元素,沒有下乙個元素。

a.函式模板:next_permutation(arr, arr+size);

b.引數說明:

arr: 陣列名

size:陣列元素個數

c.函式功能: 返回值為bool型別,當當前序列不存在下乙個排列時,函式返回false,否則返回true,排列好的數在陣列中儲存

d.注意:在使用前需要對欲排列陣列按公升序排序,否則只能找出該序列之後的全排列數。

比如,如果陣列num初始化為2,3,1,那麼輸出就變為了:

a.函式模板:prev_permutation(arr, arr+size);

b.引數說明:

arr: 陣列名

size:陣列元素個數

c.函式功能: 返回值為bool型別,當當前序列不存在上乙個排列時,函式返回false,否則返回true

d.注意:在使用前需要對欲排列陣列按降序排序,否則只能找出該序列之後的全排列數。

三、**

#include #include using namespace std;

int main ()

; cout<

四、全排列遞迴思路

我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;

演算法思路:

(1)n個元素的全排列=(n-1個元素的全排列)+(另乙個元素作為字首);

(2)出口:如果只有乙個元素的全排列,則說明已經排完,則輸出陣列;

(3)不斷將每個元素放作第乙個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

**:public class hello ;

public static void main(string args)

private static void swap(int i1, int i2)

/*** 對arr陣列中的begin~end進行全排列

* * 比如:

* arr =

* 第一步:執行 perm(,0,2),begin=0,end=2;

* j=0,因此執行perm(,1,2),begin=1,end=2;

* j=1,swap(arr,0,0)-->arr=, perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1) --> arr=;

* j=2,swap(arr,1,2)-->arr=, perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* j=1,swap(arr,0,1) --> arr=, perm(,1,2),begin=1,end=2;

* j=1,swap(arr,1,1)-->arr= perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1)--> arr=;

* j=2,swap(arr,1,2)後 arr=,並執行perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* swap(arr,1,0) --> arr=

* j=2,swap(arr,2,0) --> arr=,執行perm(,1,2),begin=1,end=2;

* j=1,swap(arr,1,1) --> arr= , perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1) --> arr=;

* j=2,swap(arr,2,1) --> arr=,並執行perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* swap(arr,0,2) --> arr=

*

*/public static void perm(int arr, int begin,int end)

system.out.println();

return;

}else}}

}

全排列函式

一 next permutation 函式,作用是輸出所有比當前排列 排列大的排列 順序為由小到大排 include include includeusing namespace std int main string str cin str while next permutation str.b...

全排列函式

人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把乙個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把乙個很小的數字加到這個大數上面,把結果告訴火星人,作為人類的回答。火星人用...

全排列函式

nest permutation函式 向下求 include include 標頭檔案 using namespace std intmain dowhile next permutation a,a 3 這是乙個求乙個排序的下乙個排列的函式 return0 執行結果 123 1322 1323 1...