/*
* 几种排列组合的算法
*/
#include<stdio.h>
int a[20];
int n;
//打印数组
void showArray(int *a)
{
int i;
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
}
//翻转法
void overturn()
{
int i,temp,temp1,temp2,j;
int b[20];
for(i=1;i<=n;i++)
*(b+n-i+1)=*(a+i);
showArray(b);
for(i=1;i<=n;i++){
//判断第一个数是否为1
if(i==1 && b[i]!=i){
temp=b[i];
for(j=1;j<n;j++)
b[j]=b[j+1];
b[j]=temp;
showArray(b);
i=0;
continue;
}
//判断第二个数是否为1
if(i==2 && b[i]!=i){
temp1=b[i];
temp2=b[i-1];
for(j=1;j+2<=n;j++)
b[j]=b[j+2];
b[j]=temp1;
b[j+1]=temp2;
showArray(b);
i=0;
continue;
}
//判断第三个数是否为1
if(i==3 && b[i]!=i){
temp=b[i];
temp1=b[i-1];
temp2=b[i-2];
for(j=1;j+3<=n;j++)
b[j]=b[j+3];
b[j++]=temp;
b[j++]=temp1;
b[j]=temp2;
showArray(b);
i=0;
continue;
}
}
}
//换位法
void changeSite()
{
int i,temp,temp1;
int b[20],max=0;
int dir[20]={-1,-1,-1,-1,-1,-1};
for(i=1;i<=n;i++)
*(b+i)=*(a+i);
showArray(b);
while(1){
max=0;
b[max]=0;
//寻找最大的活结点
for(i=1;i<=n;i++){
if(i+dir[i]>0 && i+dir[i]<=n && b[i]>b[i+dir[i]])
max=b[i]>b[max]?i:max;
}
if(max==0)
break;
//交换位置和方向
temp=b[max];
b[max]=b[max+dir[max]];
b[max+dir[max]]=temp;
temp1=dir[max+dir[max]];
dir[max+dir[max]]=dir[max];
dir[max]=temp1;
//改变比活结点大的数的方向
for(i=1;i<=n;i++)
if(b[i]>temp)
dir[i]=-dir[i];
showArray(b);
}
}
//序数法(排出的序列为有序的)
//str:待排序的字符序列 n:首字符下标 len:字符串长度
void ordinal(char * str,int n,int len)
{
int i;
char temp;
if(n==len)
puts(str);
for(i=n;i<len;i++){
temp=str[i];
str[i]=str[n];
str[n]=temp;
ordinal(str,n+1,len);
temp=str[i];
str[i]=str[n];
str[n]=temp;
}
}
void main()
{
int i;
char str[20];
for(i=1;i<=4;i++)
a[i]=i;
a[0]=n=4;
printf("对1234这四个数进行全排列\n");
printf("翻转法:\n");
overturn();
printf("换位法:\n");
changeSite();
printf("序数法:\n");
for(i=0;i<n;i++)
str[i]=a[i+1]+'0';
str[i]=0;
ordinal(str,0,n);
}
分享到:
相关推荐
自己写的基于字符的全排列算法,代码简洁,高效,7位数的全排列都是秒排!用到了广度优先排列,深度优先搜索和几个递归,唯一没完成的是退出时释放内存,呵呵,破解密码时超有用的哟,,
典型密码算法及其C语言实现共13章节,详细讲述了一些典型密码算法的算法原理及C语言实现。密码算法包括:序列密码、分组密码、公钥密码和Hash算法。其中序列密码有祖冲之算法,分组密码有DES、3DES和SMS4算法,公钥...
经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现
置换算法C语言实现
A星算法 用c语言实现 用到了队列 a*算法 A星算法 用c语言实现 用到了队列 a*算法
sha 算法c语言实现,编译成功,在nrf52832上验证的 。。
银行家算法C语言实现,避免死锁的经典算法的C语言实现
SHA256 哈希密码算法C语言实现 亲测好用。只要SHA256的实现。
RLE压缩算法C语言实现 RLE压缩算法C语言实现 RLE压缩算法C语言实现
全排列c语言实现,经典的算法适合收藏起来看之又看,翻来覆去看
算法C语言实现(第1-4部分)
PID算法相关资料数字PID控制算法C语言实现PID算法等源码及技术文档资料合集: 51单片机PID算法程序_三_增量式PID控制算法.pdf AN_SPMC75_0012 ARDUINO C语言PID算法.pdf C语言实现PID算法-27.pdf C语言实现PID算法-28...
输入N,输出1-N全排列c语言算法,非递归算法................
操作系统银行家算法用C语言实现,是一个正确无误的程序,与大家共分享
DES,DES加密算法,DES算法源码。用C写的DES加密算法。 DES,DES加密算法,DES算法源码。 DES加密算法(c语言实现) (本程序可以直接使用)
详细讲解了卡尔曼滤波算法的每一个步骤,附有C语言代码实现,有部分笔记,以及笔记笔录,认真看应该能看懂
c语言实现操作系统作业银行家算法,算法不是很复杂相信理解了算法就可以写的出来。其实代码还有些不足,望自行下去改进。 使用方法:编译后运行程序,输入保存文件绝对路径,一般在txt下,查看文件结果
算法:C语言实现算法:C语言实现算法:C语言实现算法:C语言实现
里面的数据来自UCI库,机器学习C4.5算法完全采用C语言实现