返回信息流小弟刚开始学习C,请问各位大侠怎样实现全排列呢?
例如给出五个数1,2,3,4,5,然后编程输出这五个数的各种排列方式。
烦请各位大侠指教,拜谢!!
这是一条镜像帖。来源:北邮人论坛 / cpp / #36876同步于 2010/3/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]怎样实现全排列
huangji2060
2010/3/21镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
5个数的全排列就是
第一个数排第一,剩下4个数的全排列
第二个数排第一,剩下4个数的全排列
第三个数排第一,剩下4个数的全排列
第四个数排第一,剩下4个数的全排列
第五个数排第一,剩下4个数的全排列
然后递归吧。
一个数的全排列是它本身。
另外,C++可以#include <algorithm>,里面有next_permutation这样神奇的东西,很好玩。
高德纳老师的TAOCP第4卷第一册有专门讲这个算法,看看图书馆能不能借到。
#include<stdio.h>
void print_it(int n, int arr[]);
void arrange_all(int size, int arr[], int pos);
int main()
{
int a[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
arrange_all(20, a, 0);
return 0;
}
/**//*
函数名: void arrange_all(int size, int arr[], int pos)
描述: 打印所有排列
参数:
size 要排列的数据个数
arr[] 排列存放的数组
pos 当前排列位置
*/
void arrange_all(int size, int arr[], int pos)
{
int i, tmp;
if (pos + 1== size) /**//* 如果已经排到最后 */
{
print_it(size, arr); /**//* 打印数组 */
return;
}
for (i = pos; i < size; i++) /**//* 对当前位置后的所有位置排列*/
{
tmp = arr[pos]; /**//* 交换位置 */
arr[pos] = arr[i];
arr[i] = tmp;
/**//* 递归,继续后面的调用 */
arrange_all(size, arr, pos + 1);
/**//* 在交换回来,保持原有的排列次序 */
tmp = arr[pos];
arr[pos] = arr[i];
arr[i] = tmp;
}
}
void print_it(int n, int arr[])
{
int i;
static int cnt = 0;
printf("%21d: ", ++cnt);
for (i = 0; i < n; i++)
printf("%4d ", arr[i]);
printf(" ");
}
一个简单的非递归实现
int func(int n)
{
int a[30];
int i, j, t;
int count=0;
for(i=0;i<n;i++) a[i]=i+1;
for(;;) {
printf("%4d: ", ++count);
for(i=0;i<n;i++) printf("%d ", a[i]);
printf("\n");
for(i=n-2;i>=0;i--) if(a[i]<a[i+1]) break;
if(i<0) break;
for(j=n-1;;j--) if(a[j]>a[i]) break;
t=a[j], a[j]=a[i], a[i]=t;
i++, j=n-1;
while(i<j) {
t=a[j], a[j]=a[i], a[i]=t;
i++, j--;
}
}
return(0);
}
【 在 mukong 的大作中提到: 】
: #include<stdio.h>
: void print_it(int n, int arr[]);
: void arrange_all(int size, int arr[], int pos);
: ...................
非常感谢啊 就需要这么直接的!