将1,2,3,4,5的各种排列顺序打印出来?如:12345,12354。应该有5!=120种吧(最好用递归)

high_land 2006-10-17 04:10:49
将1,2,3,4,5的各种排列顺序打印出来?如:12345,12354。应该有5!=120种吧(最好用递归)
...全文
772 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu_lengqing 2006-10-19
  • 打赏
  • 举报
回复
chiefwolf(丢丢)的不错... 比较规范,可读性也比较好
liuguangliang 2006-10-19
  • 打赏
  • 举报
回复
import java.util.*;


public class SortF{

String pailie[]={"1","2","3","4","5"};

int n=pailie.length;

int numGraph[][]=new int[n][n];//二维数组来表示图

boolean judge[]=new boolean[n];//用来判断图中的结点是否在深度优先搜索队列中。

String result="";

ArrayList al=new ArrayList();//用来保存字符串结果

public static void main(String [] args){

new SortF().start();

}

//初始化图中结点的关系,自身是不可以到达自身的;初始化判断数组。
public SortF(){

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

if(i==j) numGraph[i][j]=0;
else numGraph[i][j]=1 ;
}

judge[i]=false;
}


}

public void start(){

//始图中个结点都可以为第一个结点
for(int i=0;i<n;i++){
depthFirstSearsh(i);//有了第一个结点后,调用深度优先搜索。

}
//遍历输出字符串。
Iterator ite = al.iterator();
while (ite.hasNext()) {
String string = (String) ite.next();

System.out.println(string);

}
}

//深度优先搜索

public void depthFirstSearsh(int startN){

judge[startN]=true;//设为true后,记录了本结点已经被访问
result=result+pailie[startN];//在result中增加一个字符串,当增加到N个时,则装入al中
if(result.length()==n){
al.add(result);

}

for(int i=0;i<n;i++){
if(numGraph[startN][i]==1&&judge[i]==false){//如果statN结点到i结点是连通的,且i结点未被访问

depthFirstSearsh(i);//以i结点为根,继续搜索
}
}

judge[startN]=false;//释放结点,使得深度优先搜索,返回到上一层。

result = result.substring(0, result.length() -1);//result去掉最后一个字符串
}

}
emin_lee 2006-10-18
  • 打赏
  • 举报
回复
mark!
high_land 2006-10-18
  • 打赏
  • 举报
回复
还在学习chiefwolf(丢丢)的方法,如果还有好的方法可以在贴出来。
high_land 2006-10-18
  • 打赏
  • 举报
回复
liuguangliang(小刀刘)的方法有局限性,不过能做出来就很列害了。
chiefwolf(丢丢)方法很好,
最后有个地方要改一下:
StringBuffer sb = new StringBuffer(""+firstNum);
showSort(newArray,sb.append(num0));
谢谢了!!!!!!!!!
high_land 2006-10-18
  • 打赏
  • 举报
回复
有时一些算法也需要。
  • 打赏
  • 举报
回复
这种需求正常情况下没有用,基本只有一种应用:作暴力破解软件.
chiefwolf 2006-10-17
  • 打赏
  • 举报
回复
我来贴一个:

package jwolf.util;
public class Test{

public static void main(String[] args) {

char number[] = new char[]{'1','2','3','4','5'};
StringBuffer first = new StringBuffer();
// 递归函数执行
showSort(number,first);
}
/**
* @param num 待处理的数组
* @param firstNum 在各个上级递归中逐渐追加形成的字符串
*/
public static void showSort(char num[],StringBuffer firstNum){

for(int i=0;i<num.length;i++){

//依次把从0位到最后一位的数字交换到最前面
char temp = num[i];
num[i] = num[0];
num[0] = temp;

//交换后取得第一个字符,把后面的字符重新组成一个数组
char num0 = num[0];
char newArray[] = new char[num.length-1];
for(int j=0;j<num.length-1;j++){

newArray[j] = num[j+1];
}

//如果参数数组的长度为1,则输出结果
if(num.length==1){

String result = firstNum.append(num[0]).toString();
System.out.println(result);
}
//否则,把此次得到的第一个字符追加到传入的字符串,并递归调用
else{

StringBuffer sb = new StringBuffer(firstNum);
showSort(newArray,sb.append(num0));
}
}
}
}

liuguangliang 2006-10-17
  • 打赏
  • 举报
回复
请大家指正
liuguangliang 2006-10-17
  • 打赏
  • 举报
回复
public void prints(int k1,int,k2,int k3,int k4,int k5){

int i=0;
if(k5!=0){

System.out.print(k1*10000+k2*1000+k3*100+k4*10+k5);
return;


for(i=1;i<=5;i++){

if(k1==0) prints(i,k2,k3,k4,k5);

else if(k2==0){

if(i==k1) continue;
else prints(k1,i,k3,k4,k5);
}
else if(k3==0){

if(i==k2||i==k1) continue;
else prints(k1,k2,i,k4,k5);
}
else if(k4==0){
if(i==k3||i==k2||i==k1) continue;
else prints(k1,k2,k3,i,k5);
}
else if(k5==0){
if(i==k4||i==k3||i==k2||i==k1) continue;
else prints(k1,k2,k3,k4,i);
}

}//for结束。
}










liuguangliang 2006-10-17
  • 打赏
  • 举报
回复
实现起来不难,但是递归,暂时还没想到
high_land 2006-10-17
  • 打赏
  • 举报
回复
我大学不是计算机地,没有大学C的课本?
公亮 2006-10-17
  • 打赏
  • 举报
回复
这个递归不是很简单?
大学时候C的课本上就有!

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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