AgPro

导航

排列--perm_next法

#include <iostream>
#include <algorithm>
using namespace std;

void initial(int *x,int n)//排列组合数组元素的初始化(无重复的情况)
{   
	for( int i=1;i<=n;i++ )   
		x[i]=i;   
}   

void execute(int *x,int n)//自定义执行函数
{   
	for(int   i=1;i<=n;i++)   
		cout << x[i] << " ";   
	cout << endl;   
}   

int perm_next( int *p,int n )//下一个排列(字典序法)
{   
	int i,j;   
	for(i=n;(p[i-1]>=p[i])&&(i>=1);i--);   
		if(i==1) return 0;   
	for(j=n;(p[i-1]>=p[j])&&(j>=0);j--);   
		swap(p[i-1],p[j]);   
	for(j=0;j<(n-i+2)/2;j++)   
		swap(p[i+j],p[n-j]);   
	return 1;   
}

void perm( int n )//n个元素的全排列(字典序法)
{   
	int *p = new int[n+1];   
	initial(p,n);   
	do     
	{   
		execute(p,n);   
	}   
	while(perm_next(p,n));   
	delete p;   
}   


int main()
{ 
	int N=4;
	perm(N);   

	return   0; 
}

posted on 2010-06-11 11:29  AgPro  阅读(201)  评论(0编辑  收藏  举报