1. 程式人生 > >next_permutation VS prev_permutation(序列的全排列)

next_permutation VS prev_permutation(序列的全排列)

C++ STL大法好!!! 

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

該段程式碼意思為求1,2,3,4的全排列。

next_permutation(a,a+4)

即求括號中內容的下一個排列。如: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.

一道經典題,感受下STL大法好

看這簡潔的程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10005];
int main(){
	int n, m;
	cin >> n >> m; 
	for(int i = 0; i < n; i++){
		scanf("%d",&a[i]);
	}
	for(int i = 0; i < m; i++){
		next_permutation(a,a + n);
	}
	for(int i = 0; i < n; i++){
		printf("%d ",a[i]);
	}
	return 0;
}