演算法筆記03--歸納法之生成排列

兔美醬xz發表於2014-11-23

生成排列

生成排列即對n個數的全排列,顯然時間複雜度是n指數級的O(n^k)

假定可以生成n-1個數的所有排列,那麼就可以擴充套件生成1,2,.....,n的排列。

例如1的生成排列即1

1,2的生成排列即1,2和2,1

1,2,3的生成排列在1,2的生成排列基礎上可以這樣得到:

1在第1位,2,3的生成排列

2在第1位,1,3的生成排列

3在第1位,2,3的生成排列

那麼推廣到1,2,...,n的生成排列即:

1在第1位,2,...,n的生成排列

2在第2位,1,3,...n的生成排列

....

n在第1位,2,...,n的生成排列

先考慮數字1在第一位,那麼對2,,...,n生成排列,

思路:

1.對0到n-1位置上的數字生成排列,具體做法 從1,,..,n中按序拿出數字i(i從1開始到n)與位置j(j從0開始到n-1)上的數字交換,再對位置j+1到n-1位置上的數字生成排列。

2.對j(j從1開始)到n-1位置上的數字生成排列,具體做法 從2,,..,n中按序拿出數字i(從2開始)與位置j上的數字交換,再對位置j+1到n-1位置上的數字生成排列。

3.......當j = n時,生成一個排列並列印

4. 回溯上一步,拿出數字i+1與j上的數字交換,並對j+1後面的序列生成排序

5. 直到i>n,結束

#include <iostream>  
using namespace std; 
 
void permutation(int* array, int iLength, int iCurStep)
{
	if(iLength == iCurStep) //若固定位置指標指到最後一個數字列印陣列
	{	
		for(int i=0;i<iLength;i++)
		{
			cout<<array[i]<<" ";
		}
		cout<<"\n";
		return ;
	}
	else
	{
		for(int i = iCurStep ; i<iLength ; i++)  //i為從固定指標位置到最後一個數字位置的掃描指標
		{
			swap(array[iCurStep],array[i]); //固定從iCurStep起每個位置上的數字到iCurStep上
			permutation(array,iLength,iCurStep+1);
			swap(array[i],array[iCurStep]); //復原array
		}
	}
}
 
int main(){ 
    int array[] = {1,2,3,4}; 
    permutation(array, 4, 0); 
}

相關文章