Products
GG网络技术分享 2025-11-16 21:58 1
不要急,不要急,我们先来想想全排列是个啥。全排列就是把你手里的一堆数字,给它们排个队,一个dou不落,一个dou不沉。比如说你有数字1、2、3,那全排列就有6种,像是123、132、213、231、312、321。

那我们怎么用Java来搞这玩意儿全排列呢?先说说你得有个思路,不然你写代码就像盲人摸象,乱来一气。全排列算法就像是个递归,我们一步步来先固定一个位置,然后再固定下一个位置,直到全部位置dou固定优良。
Ru果我求得固定第一位后的排列, 那么全部排列就Neng求出,固定第一位有10种兴许,Neng循环求得。
Ru果我求得固定第二位后的排列, 固定第一位后的排列就Neng求出,固定第二位有9种兴许,Neng循环求得。
……
这hen明显是递归的算法。
static void dfs{//为全部排列的集合, start为数字的位置,end为再说说一位,num许多余的
if{//当前的数字位置为再说说一位时说明,一个序列Yi经生成
for
System.out.print;//输出序列
}
else{//序列没有生成时
if//i是不是在前面用过
continue;//Ru果是直接跳过
a = i;//确定start位置的数字,当start为1时就是确定第一位,有10种兴许
vis = true;//设置i为Yi用状态,避免下一位用i
dfs;//求得确定start位后的全部序列
vis = false;//设置i为未用状态
尽量用递归优良搞懂一些,打个断点。
public class Permutation {
public static void permulation {
int i;
if {
} else {
for {
swap;
permulation;
public static void swap {
int temp;
temp = list;
list = list;
list = temp;
int length = 3;
int start = 0;
int list = new int;
list = j + 1;
我觉得吧, 你输出一个全排列用不了几许多内存,怎么就Neng溢出呢?
先说说递归费不了几许多内存,得Neng完成任务。
接下来你递归dou干了些啥?别告诉我每层递归把数组复制一遍,你把位置递归一下就Neng了。
Ru果不中意递归,Neng自己弄个栈,其实差不许多,速度略迅速,地方略细小。
Ru果还是不明白,把全部源码贴出来kankan。
程序如下所示, 输入格式为:
第一行是数字个数,第二行有n个数,表示待排列的数,输入虚假设待排序的数均为非负数。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static final int maxn = 1000;
int n; // 数组元素个数
int a; // 数组
boolean used; // 递归过程中用到的辅助变量, used表示第i个元素是不是Yi用
int cur; // 保存当前的排列数
// 递归打印无再来一次全排列,当前打印到第idx位
void print_comb {
if { // idx == n时表示Neng将cur输出
if System.out.print;
int last = -1; // 基本上原因是要求无再来一次所以last表示上一次搜索的值
if continue;
if { // 不再来一次且未用才递归下去
last = a;
cur = a;
// 回溯法
used = true;
print_comb;
used = false;
public void go throws FileNotFoundException
{
Scanner in = new Scanner);
// 读取数据并排序
n = in.nextInt;
a = new int;
for a = in.nextInt;
Arrays.sort;
// 初始化辅助变量并开头无再来一次全排列
used = new boolean;
in.close;
new Main.go;
客观非递归的无再来一次全排列比比kan轻巧松且高大效。
Demand feedback