探讨一个排列的算法

veinstone 2004-06-07 09:06:21
如何用递归的方法列举一个列表的无重复排列?
注意,不是计算排列数,如:f(n) = f(n-1)*n,这个不要。
要的是:有{a,b,c}一个列表,列出它的无重复排列是{{a,b,c},{a,c,b},{b,a,c},{b,c,a},{c,a,b},{c,b,a}}。
注意要用递归的方法啊!!
...全文
343 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaonian_3654 2004-06-21
  • 打赏
  • 举报
回复
楼上,你怎么用拼音命名,怕怕
nainaixiong 2004-06-18
  • 打赏
  • 举报
回复
俺也写了一个:

#include "stdafx.h"
#define N 3
void pailie(int n);
int num[10];
int num_[10];
int main(int argc, char* argv[])
{
for(int i=0;i<N;i++)
{
num[i]=i;
num_[i]=-1;
}
pailie(0);

return 0;
}

void pailie(int n)
{
for(int i=0;i<N;i++)
{
bool f=false;
for(int j=0;j<n;j++)
{
if(num[i]==num_[j])
{
f=true;
break;
}
}

if(f)continue;

num_[n]=num[i];

pailie(n+1);

if(n==N-1)
{
for(int ii=0;ii<N;ii++)
{
printf("%d ",num_[ii]);
}
printf("\n",n);
}
}
}
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
等一会,我编个不是递归的看看,运行时间嘛,是这种算法程序比较关键的。我当然知道程序慢在哪里了
xiaonian_3654 2004-06-14
  • 打赏
  • 举报
回复
我对这个速度没有兴趣,但是我能明确的告诉你慢在那里
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
你自己看你的程序运行时间就知道了,几乎是mmmcd(超超) 的一倍,知道为什么吗?
不要迷信大师,你想想就应该知道,你的程序肯定要慢很多!
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream.h>
#include <time.h>
#include <assert.h>

using namespace std;


int used[30],p[30],n = 8;


void go(int k)
{
int i;
if(k==n)
{
//for(i=0;i<n;i++)printf("%c",p[i]+'a');
//printf("\n");
return;
}
for(i=0;i<n;i++)
{
if(used[i])continue;
used[i]=1;
p[k]=i;
go(k+1);
used[i]=0;
}
}




void main( void )
{
clock_t start1, finish1,start2,finish2;
double duration1,duration2;
char str[]="ABCDEFGH";

start1 = clock();
//assert(start);


for(int number1 = 0 ;number1 < 100 ;number1 ++)
while(next_permutation(str,str+8))
;
//cout<<str<<endl;



finish1 = clock();
//assert(finish);

start2 = clock();

for(int number2 = 0 ;number2 < 100 ;number2 ++)
go(0);
finish2 = clock();


duration1 = (double)(finish1 - start1) / CLOCKS_PER_SEC;
duration2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;

cout<<duration1<<endl;
cout<<duration2<<endl;
cout<<duration2/duration1<<endl;

}

xiaonian_3654 2004-06-14
  • 打赏
  • 举报
回复
要是说到效率,我看未必吧,毕竟这是出自大师手笔的
虽然不能迷信大师,但是大师就是大师

至于什么不用递归,不过就是把递归转化为非递归而已
你要是有兴趣,可以改一改啊
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
to xiaonian_3654(你猜猜):

你的程序嘛,调用了一个模板函数来做,老实说,效率真的比较低,我想看看有谁能给出一个自己写的算法,递归的好像就一楼的最好了,不用递归的暂时没有发现,期盼中……
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
to CsdnPlayer(CSDN首席军师)(公孙智多星) :

你的程序效率比较低
CsdnPlayer 2004-06-14
  • 打赏
  • 举报
回复
呵呵,孤陋寡闻了。组合数学很有用么?
xiaonian_3654 2004-06-14
  • 打赏
  • 举报
回复
算法实际上是stl中的,任何一本组合数学上都讲的,我不敢贪天之功啊,
呵呵
fireofhell 2004-06-14
  • 打赏
  • 举报
回复
我刚写了一个,结果测试时发现漏掉了一类情况,晕!不过从执行的速度来看,少去了递归的大量调用函数,这样可以节省很多时间,系统不用反复的保存堆栈释放堆栈
CsdnPlayer 2004-06-13
  • 打赏
  • 举报
回复
to xiaonian_3654(你猜猜),
我觉得你的代码是另一种思虑,不是取字符来组成字符串,而是将已有字符串的字符进行换位,不错!
CsdnPlayer 2004-06-13
  • 打赏
  • 举报
回复
//C语言 递归版
//Windows2000+VC6 测试通过
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 3
char string[N] = {'A', 'B', 'C'};
char output[N];

bool setOne(int index);
bool isValid(int index, char target);

void main(void)
{
setOne(0);
getchar();
exit(0);
}

bool setOne(int index)
{
int count;
//int i=index;
for(count=0; count<N; count++) {
if(isValid(index, string[count]))
output[index] = string[count];
else
continue;
if((index+1)<N) {
setOne(index+1);
} else {
char temp[N+1];
temp[N] = '\0';
strncpy(temp , output, N);
puts(temp);
}
}
return true;
}

bool isValid(int index, char target)
{
int count;
for(count=0; count<index; count++) {
if(output[count] == target)
return false;
}
return true;
}
chenzhichao2008 2004-06-12
  • 打赏
  • 举报
回复
用队列一样可以做的
darkfirexl 2004-06-12
  • 打赏
  • 举报
回复
怎么用队列作
xiaonian_3654 2004-06-12
  • 打赏
  • 举报
回复
我的程序怎么没有关注?????????

darkfirexl 2004-06-11
  • 打赏
  • 举报
回复
to 懒鬼:我只是把我以前写的程序复制过来而已,当然会有点乱。
fireofhell 2004-06-11
  • 打赏
  • 举报
回复
看了这么多,还是看mmmcd(超超)的最顺眼,不过没有看到让人耳目一新的程序啊!
chenzhichao2008 2004-06-11
  • 打赏
  • 举报
回复
#include "iostream.h"
#include "stdlib.h"
#define N 3
int uses[N]={0},mark[N]={0};
int k=0;

void order(int a[],int i)
{
int tag;
int j=0;
uses[i]=1;
mark[k++]=a[i];
if(k==N)
{
for(j=0;j<N;j++)
cout<<mark[j];
cout<<endl;
}
for(j=0;j<N;j++)
{
if(uses[j]) continue;
order(a,j);
}
k--;
uses[i]=0;
}

void main()
{
int a[N];
int i;
for(i=0;i<N;i++)
cin>>a[i];
for(i=0;i<N;i++)
order(a,i);
system("pause");
}
加载更多回复(24)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧