您的位置:首页 > 其它

打印数组a{1,2,...,n}的全排列(交换)

2011-08-15 16:05 267 查看
递归思想:

取出数组中第一个元素放到最后,即a[1]与a
交换,然后递归求a[n-1]的全排列

1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}

2)如果数组有两个元素n=2,a={1,2} 则全排列是

{2,1}--a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)

{1,2}--a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)

3)如果数组有三个元素n=3,a={1,2,3} 则全排列是

{{2,3},1}--a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)

{{1,3},2)--a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)

{{1,2},3)--a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)

...

以此类推。

马上用C代码实现,成功!

#include <stdio.h>

int g_count = 1;

int g_n = 0;

void print_result(int *a)

{

int i = 0;

printf("count %d:", g_count++);

for (i=0; i<g_n; i++)

{

printf(" %d", a[i]);

}

printf("\n");

return;

}

#define swap(a, b)\

{\

int tmp = a;\

a = b;\

b = tmp;\

}

void p(int *a, int size)

{

if (size == 1)

print_result(a);

else

{

int i, tmp = 0;

for (i=0; i<size; i++)

{

swap(a[i], a[size-1]);

p(a, size-1);

swap(a[i], a[size-1]);

}

}

return;

}

void main(void)

{

int array[] = {1, 2, 3, 4};

g_n = sizeof(array) / sizeof(int);

p(array, g_n);

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐