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