百度百科关于排列的定义如下:
一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。
有一个简单的排列问题:假如有a,b,c三个数,它们有多少种排列方式,各是什么?
这个题的答案很快就能想到,一共有6种不同的排列方式(abc、acb、bac、bca、cba、cab)。那假如是四个数,五个数呢?
接下来我们用C代码来实现这个排列问题。代码如下:
#include<stdio.h>
#define LIST_LEN 3
#define SWAP_VALUE(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
void func_permutation(char *list,int start_index,int last_index);
int perm_count;
int main(void)
{
char list[] = "abc";
func_permutation(list,0,LIST_LEN - 1);
printf("总共有%d种排列方式!\n",perm_count);
return 0;
}
void func_permutation(char *list,int start_index,int last_index)
{
char temp;
int i;
if(start_index == last_index)
{
printf("%s\n",list);
perm_count++;
}
else
{
for(i = start_index;i <= last_index;i++)
{
SWAP_VALUE(list[i],list[start_index],temp);
func_permutation(list,start_index + 1,last_index);
SWAP_VALUE(list[i],list[start_index],temp);
}
}
}
该代码采用递归的方式,循环调用func_permutation函数。
假如我们要是想实现四个数或者五个数甚至更多数的排列问题,只需修改宏定义LIST_LEN 的值和list数组的字符串就可以了。
例如实现四个数的排列问题,将上述代码中的#define LIST_LEN 3改为#define LIST_LEN 4,char list[] = "abc";改为char list[] = "abcd";就可以实现了。