怎么样求数组的一个全排列。

招RD和QA 2011-01-25 01:47:52
比如说给个整数数组,要求打印出其内容的全排列。
int a[] = { 1, 2, 3 };

它的全排列是,
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
...

请问这个算法如何设计 ?
...全文
3022 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_D眼泪 2013-10-20
  • 打赏
  • 举报
回复
急求java code 跪求大神帮忙!
艾妮20131 2013-10-06
  • 打赏
  • 举报
回复
能看到的可以加我QQ帮我解答 在这里给大家说声谢谢 我QQ2220174
wshcdr 2011-02-25
  • 打赏
  • 举报
回复
void sort(int * arr, int n)
{
if (n == 3)
{
for(int i = 0; i < n ; ++i)
printf(arr[i]);
return
}
else
{
int temp=0;
for(int j = 0; j < n; k++)
{
for(int k=j;k<n;k++)
{
temp = arr[k];
arr[k] = arr[j];
arr[j] = temp
sort(arr, k)
temp = arr[k];
arr[k] = arr[j];
arr[j] = temp
}
}
}
}
qyxqyxqyx 2011-01-29
  • 打赏
  • 举报
回复
用回溯
#include<stdio.h>
#include<math.h>
static int nn=1;
bool canplace(int* queen,int k,int i,int n){
for(int l=0;l<k;l++){
if(i==queen[l])
return 0;
}
return 1;
}
void print(int* queen,int n){
for(int l=0;l<n;l++){
printf("%d ",queen[l]+1);
}
printf("\n");
}
/*void print(int* queen,int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==queen[i])
printf("Q");
else
printf("*");
}
printf("\n");
}
}*/
void queens(int* queen,int k,int n){
for(int i=0;i<n;i++){
if (canplace(queen,k,i,n))
{
queen[k]=i;
if(k==n-1){
printf("the %dth answer is:\n",nn);
nn++;
print(queen,n);
printf("\n");
}
else
queens(queen,k+1,n);
}
}
return;
}
void main(){
int queen[5];
queens(queen,0,5);
}
skinnymonkey 2011-01-29
  • 打赏
  • 举报
回复
递归和循环都可以。比如a , b , c

a
ab , ba (即把下一个元素放在所有可能的位置上)
cab, acb, abc, cba, bca, bac (把c放在上一层结果所有可能的位置上)
招RD和QA 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 viper 的回复:]
又想到一个递归的算法,一个K个元素的全排列,是不是可以这样得到,先求出K-1个元素的全排列,然后将第K个元素放到前面求得的全排列的所有可能的不同位置上。

比如求 1 2 3 的全排列,可以先求得 2 3 的全排列,再求得3的全排列,即3本身,然后将2放在不同的位置上,得到{ 2 3 } 和 { 3 2 },再将1放在它们的所有可能的位置上,得到 { 1 2 3 } { 2 1 3 } { 2……
[/Quote]

我试图去实现这个算法,不过好像不能实现。大家能不能看看。
lzy18lzy 2011-01-28
  • 打赏
  • 举报
回复
我这里有优化的小方法,测试能提高30%左右的时间...

http://blog.csdn.net/lzy18lzy/archive/2009/12/22/5053823.aspx
lzy18lzy 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lihao21 的回复:]

顶8楼说的permultation
[/Quote]

STL那枚举全排列,虽然简结,但算是最慢的。。。
haozlee 2011-01-28
  • 打赏
  • 举报
回复
顶8楼说的permultation
hangzhouhao 2011-01-27
  • 打赏
  • 举报
回复
先转换成你给定数组的下标的全排列,即0 1 2的全排列:
如果把每种组合看作一个3位数,则每个组合相对上一个组合可认为是增加了1!这样既能避免重复,又能防止遗漏,是最有效、最明确的遍历方式。所以关键就是把组合转化成一个自然数。考虑到一共有64种可能(4×4×4=4^3),只需与64个自然数(1-64)建立对应关系。观察到003的下一个组合是010,即010相当与004,所以十位的1相当于各位的4,这不就是4进制吗?!从自然数到组合方式,可以通过求余和整除得到。例如:最后一个组合333,对应的数字为63,从63得到333的过程为:个位数=63%4=3;十位数=(63/4)%4=17%3=3;百位数=(63/4/4)%4=3%4=3。

详见
http://blog.csdn.net/hangzhouhao/archive/2011/01/26/6164508.aspx
星大侠 2011-01-27
  • 打赏
  • 举报
回复
王晓东 的算法书中,有此问题的详细阐述。
招RD和QA 2011-01-27
  • 打赏
  • 举报
回复
又想到一个递归的算法,一个K个元素的全排列,是不是可以这样得到,先求出K-1个元素的全排列,然后将第K个元素放到前面求得的全排列的所有可能的不同位置上。

比如求 1 2 3 的全排列,可以先求得 2 3 的全排列,再求得3的全排列,即3本身,然后将2放在不同的位置上,得到{ 2 3 } 和 { 3 2 },再将1放在它们的所有可能的位置上,得到 { 1 2 3 } { 2 1 3 } { 2 3 1} 和 { 1 3 2 } { 3 1 2 } { 3 2 1 }。

大家觉得可不可行?这好像不是递归了。
招RD和QA 2011-01-27
  • 打赏
  • 举报
回复
STL的nnext_permultation(),还有递归的方法简单明了。
楼上的方法不是很容易理解。能给个程序代码嘛?
cnmhx 2011-01-26
  • 打赏
  • 举报
回复
一个建议:
定义一种类似于字典序的序。
由序自动生成后继元素。
你只须给出第一个元素123...和最后一个中止元素...321。
这样做的好处是,效率高,问题与维数无关。
icessl 2011-01-25
  • 打赏
  • 举报
回复
7 楼正解. 楼主更想到整数的全排列,7楼的C程序改一下就好了.如下:

void Perm(int a[],int n,int t)
{
int i,x;

if (t>=n-1)
{
for (i=0;i<n;i++) printf("%d ",a[i]);
printf("\n");
}
else
for (i=t;i<n;i++)
{
x=a[t]; a[t]=a[i]; a[i]=x;
Perm(a,n,t+1);
x=a[t]; a[t]=a[i]; a[i]=x;
}
}

调用方法是:
Perm(a,3,0)
alphaxiang 2011-01-25
  • 打赏
  • 举报
回复
对索引进行全排列也就对数组进行全排列了吧
pmars 2011-01-25
  • 打赏
  • 举报
回复
next_permultation()
  • 打赏
  • 举报
回复
可以递归来做:



void swap(char *str1,char *str2)
{
char temp;
temp=*str1;
*str1=*str2;
*str2=temp;
}

void permStr(char *str,int i)
{
//printf("%d",i);
if(i==strlen(str)-1)
printf("%s\n",str);
else
{
for(int j=i;j<strlen(str);j++)
{
//printf("i %d,j %d",i,j);
swap(&str[i],&str[j]);
permStr(str,i+1);
swap(&str[i],&str[j]);
}
}
}

int main()
{
char str[]={"abc"};

permStr(str,0);
return 0;

}
sxq310 2011-01-25
  • 打赏
  • 举报
回复
先想到的是递归
yaoweijq 2011-01-25
  • 打赏
  • 举报
回复
全排列一般来说复杂度都是指数级别的
加载更多回复(4)

33,008

社区成员

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

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