1. 程式人生 > >next_permutation的思想和用法(全排列函式)

next_permutation的思想和用法(全排列函式)

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[4]={1,2,3,4};
	do{
		cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
	}
	while(next_permutation(a,a+4));
	system("pause");


}
即求括號中內容的下一個排列。如:a[4]={1,2,3,4}.next_permutation(a,a+4) 即為1,2,4,3.

函式原型:

若為4,3,2,1.next_permutation的返回值即為false,因為沒有下一個排列。但是經過一次函式呼叫之後會變為1,2,3,4.

與之相對的還有一個函式為prev_permutation()  顧名思義,該函式為求上一個排列。

百度百科中的解釋如下:

next_permutation函式將按字母表順序生成給定序列的下一個較大的排列,直到整個序列為降序為止。prev_permutation函式與之相反,是生成給定序列的上一個較小的排列。二者原理相同,僅遍例順序相反

問題:如何求一個數組的下一個排列?

假設該陣列為3 6 4 2.下一個排列應為 4 2 3 6.

過程:對於一個任意序列,最小的排列是增序,最大的為減序。

從最後一位向前看,首先得到的是2,單純的一個數不需要進行交換。

然後得到的是 4 2,4大於2,在這個子序列中已經為最大序列,無法排出更大的序列了。

然後得到的是 6 4 2,原理同上。

之後得到的是 3 6 4 2,此時由於3小於6且小於4,而 3 6 4 2的下一個排列應為比3 6 4 2這個排列大的排列中最小的那個,所以3應該和4進行交換,此時該排列變為 4 6 3 2.此時4位於首端,所以之後的序列應為最小序列,即 2 3 6.綜上,最終結果應為 4 2 3 6.