全排列的实现

来源:互联网 发布:淘宝怎么测试标题 编辑:程序博客网 时间:2024/04/29 20:02

/*
 *用递归进行全排列
 *思路是:比如a,b,c三个数进行全排列,a先拿出来,b、c进行全排列,b、c中b又先拿出来,c进行全排列,然后c拿出来,b进行全排列,依次类推。
 */
#include<stdio.h>

int k=0;
int count=0;//计算有多少种排列
char str[10];//保存一个排列

//对数组中的数字行全排列,结果保存在str二维字符数组中
void arrange(int *array,int length)
{
    int i,t;
    if(length==0){
  puts("no element!");
  return;
 }
 if(length==1){//只有一个元素进行全排列
  str[k]=*array+'0';
  str[k+1]='\0';
  puts(str);
  count++;
  return;
 }
 for(i=0;i<length;i++){
  if(i){//当要拿出来的数不在数组的第一位时,把它放到第一位,即拿出一个数来
   t=*array;
   *array=*(array+i);
            *(array+i)=t;
  }
  str[k++]=*array+'0';//把拿出来的数放入排列中
  arrange(array+1,length-1);//数组下标加一,即除去第一个拿出来的数,剩下得数全排列
  k--;//
  if(i){//把拿出的数字还原,不然会影响后面的排列,比如a,b,c。a,c,b 这两个排完之后,还原成a,b,c,在把b拿出来...
   t=*array;
   *array=*(array+i);
            *(array+i)=t;
  }
 }
}

void main()
{
 int array[10]={1,3,5,7};
 arrange(array,4);
 printf("count == 4! == %d\n",count);
}