生成排列程序

第一篇,不知怎么写.刚刚在看<组合数学>在第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;
}
posted @ 2011-11-07 23:45  zhuangzhuang1988  阅读(400)  评论(0编辑  收藏  举报