第一篇,不知怎么写.刚刚在看<组合数学>在第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;
}