打印数组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;
}
取出数组中第一个元素放到最后,即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;
}
相关文章推荐
- 定义一个数组,编程打印它的全排列
- Java实现:按要求打印数组的排列情况
- 形如数组1223打印所有不同的组合排列java
- 编程:用java 语言实现,输入一个数,就相应地输出的几维数组!||用1、2、2、3、4、5这六个数字,用java写一个函数,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连
- 如何定义一个数组,编程打印它的全排列
- 递归实现打印一个数组的所有排列
- C语言如何打印一个数组排列组合?
- “数组排列方法之交换法排序”的理解
- 排列组合-打印出一个数组的元素的所有排列方式-算法
- 打印数组从小到大排列和冒泡排序
- 祝福:新春新年大吉大利。问鼎天下,谁与争锋。非递归非交换非转数组非无序全排列组合算法,诚邀比、测、评。
- 打印一维数组的全排列组合,递归算法
- 打印给定一个数组序列的所有的排列的类n皇后问题
- 深度优先算法--打印数组全排列
- 将数组里的负数排在数组的前面,正数排在数组的后面。但不改变原先负数和正数的排列顺序。
- 两个数组内容交换、1~100中9出现的次数、三个数从大到小输出
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- JavaScript实现数字数组正序排列的方法
- * java 中的数组 对象数组 以及main方法中的参数 x y不用中间参数实现交换