生成排列程序

第一篇,不知怎么写.刚刚在看<组合数学>在第57页讲到了生成排列的算法.于是乎就实现了一下.

具体的可以参考http://zh.wikipedia.org/wiki/%E6%8E%92%E5%88%97

#include <stdio.h>

#include <stdlib.h>

#define NUM 5



typedef enum direct{left,right}direct;



typedef struct data_s{

	int val;

	direct dir;

}data_t;



//填充数据

void fulldata(data_t *data,int num)

{

	for(int i =0;i<num;i++)

	{

		data[i].val = i+1;

		data[i].dir = left;

	}

}



//最大活动数据位置

int getmaxactive(data_t *data,int num)

{	

	int maxi = -1;

	int maxv = -1;

	for(int i=0;i<num;i++)

	{

		if(i==0 && data[i].dir ==left)

			continue;

		if(i==num - 1 && data[i].dir == right)

			continue;

		if(data[i].dir == right && data[i].val > data[i+1].val)

		{			

			if(maxv < data[i].val)

			{

				maxv = data[i].val;

				maxi = i;

			}			

		}

		if(data[i].dir == left && data[i].val > data[i-1].val)

		{

			if(maxv < data[i].val)

			{

				maxv = data[i].val;

				maxi = i;

			}			

		}

	}

	return maxi;

}



//打印出数据

void printdata(data_t *data,int num)

{

	for(int i=0;i<num;i++)

	{

		printf("%d ",data[i].val);		

	}

	printf(" \n");

}



//交换最大活动数与临近值

void changevalue(data_t *data,int maxi)

{	

	data_t tmp;   //交换使用

	if(data[maxi].dir == left)

	{

		tmp = data[maxi];

		data[maxi] = data[maxi-1];

		data[maxi-1] = tmp;

		return;

	}



	if(data[maxi].dir == right)

	{

		tmp = data[maxi];

		data[maxi] = data[maxi+1];

		data[maxi+1] = tmp;

		return;

	}

}



//交换p>v的值的方向

void changedir(data_t *data,int num,int maxv)

{

	for(int i=0;i<num;i++)

	{

		if(data[i].val > maxv)

		{

			if(data[i].dir == right)

				data[i].dir = left;

			else if(data[i].dir == left) 

				data[i].dir = right;

		}

	}

}



int main()

{	

	int maxi = 0; //最大活动数位置	

	int maxv = 0; //最大活动数值		

	data_t data[NUM];

	fulldata(data,NUM);	



	while((maxi = getmaxactive(data,NUM))!=-1)

	{	

		maxv = data[maxi].val;

		printdata(data,NUM);

		changevalue(data,maxi);		

		changedir(data,NUM,maxv);

	}

	//最后一个

	printdata(data,NUM);



	return 0;

}

你可能感兴趣的:(生成)