当前位置:首页 » 操作系统 » 全排列的java算法

全排列的java算法

发布时间: 2022-08-27 00:29:58

java全排列递归算法

思路:先有一个起始排列,如1234.从后面扫描,直到找到a[k],a[k]<a[k+1];再从后面扫描,直到找到a[j],这里有 a[k]<a[j]。交换a[k],a[j].再把a[k+1],...a[n-1]排序(从小到大),即得到了一个排列,再循环下去,直到找出所有的排序。用C语言的,参考下: http://user.qzone.qq.com/646203846/infocenter?ptlang=2052

㈡ java中,用递归方法求n个数的无重复全排列,n=3。

程序如下所示,输入格式为:

5
31212

第一行是数字个数,第二行有n个数,表示待排列的数,输入假设待排序的数均为非负数。


importjava.io.File;
importjava.io.FileNotFoundException;
importjava.util.Arrays;
importjava.util.Scanner;

publicclassMain{
staticfinalintmaxn=1000;
intn;//数组元素个数
int[]a;//数组

boolean[]used;//递归过程中用到的辅助变量,used[i]表示第i个元素是否已使用
int[]cur;//保存当前的排列数

//递归打印无重复全排列,当前打印到第idx位
voidprint_comb(intidx){
if(idx==n){//idx==n时,表示可以将cur输出
for(inti=0;i<n;++i){
if(i>0)System.out.print("");
System.out.print(cur[i]);
}
System.out.println();
}

intlast=-1;//因为要求无重复,所以last表示上一次搜索的值
for(inti=0;i<n;++i){
if(used[i])continue;

if(last==-1||a[i]!=last){//不重复且未使用才递归下去
last=a[i];
cur[idx]=a[i];

//回溯法
used[i]=true;
print_comb(idx+1);
used[i]=false;
}
}
}

publicvoidgo()throwsFileNotFoundException
{
Scannerin=newScanner(newFile("data.in"));

//读取数据并排序
n=in.nextInt();
a=newint[n];
for(inti=0;i<n;++i)a[i]=in.nextInt();
Arrays.sort(a);

//初始化辅助变量并开始无重复全排列
cur=newint[n];
used=newboolean[n];
for(inti=0;i<n;++i)used[i]=false;
print_comb(0);
in.close();
}

publicstaticvoidmain(String[]args)throwsFileNotFoundException{
newMain().go();
}
}

客观来说,非递归的无重复全排列比较简单且高效。

㈢ Java的排序算法有哪些

java的排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。
1.插入排序:直接插入排序、二分法插入排序、希尔排序。
2.选择排序:简单选择排序、堆排序。
3.交换排序:冒泡排序、快速排序。
4.归并排序
5.基数排序

㈣ java全排列 数组

全排列算法很多,这是其中一个,使用递归——


import java.util.ArrayList;
import java.util.List;
public class PermAComb {
static List<int[]> allSorts = new ArrayList<int[]>();

public static void permutation(int[] nums, int start, int end) {
if (start == end) { // 当只要求对数组中一个数字进行全排列时,只要就按该数组输出即可
int[] newNums = new int[nums.length]; // 为新的排列创建一个数组容器
for (int i=0; i<=end; i++) {
newNums[i] = nums[i];
}
allSorts.add(newNums); // 将新的排列组合存放起来
} else {
for (int i=start; i<=end; i++) {
int temp = nums[start]; // 交换数组第一个元素与后续的元素
nums[start] = nums[i];
nums[i] = temp;
permutation(nums, start + 1, end); // 后续元素递归全排列
nums[i] = nums[start]; // 将交换后的数组还原
nums[start] = temp;
}
}
}

public static void main(String[] args) {
int[] numArray = {1, 2, 3, 4, 5, 6};
permutation(numArray, 0, numArray.length - 1);
int[][] a = new int[allSorts.size()][]; // 你要的二维数组a
allSorts.toArray(a);

// 打印验证
for (int i=0; i<a.length; i++) {
int[] nums = a[i];
for (int j=0; j<nums.length; j++) {
System.out.print(nums[j]);
}
System.out.println();
}
System.out.println(a.length);
}
}

㈤ Java 缺项全排列算法怎么写 新人求教!~

public static void main(String[] args) {
System.out.println(KeyEvent.VK_UP);
String a = "1234";
char[] arry = a.toCharArray();
for (int i = 0; i < arry.length; i++) {
System.out.println(arry[i]);
}
for (int i = 0; i < arry.length; i++) {
for (int j = i + 1; j < arry.length; j++) {
System.out.println(arry[i] + "" + arry[j]);
}
}
for (int i = 0; i < arry.length; i++) {
for (int j = i + 1; j < arry.length; j++) {
for (int z = j + 1; z < arry.length; z++) {
System.out.println(arry[i] + "" + arry[j] + "" + arry[z]);
}
}
}
}

㈥ java 全排列算法

标准版本:
public static void main(String[] args) {
List<Integer[]> resultList = new LinkedList<Integer[]>();
construct(new int[]{0, 1}, new LinkedList<Integer>(), 4, resultList);
for (Integer[] result : resultList) {
System.out.println(Arrays.toString(result));
}
}

private static void construct(int[] elements, List<Integer> pre, int length, List<Integer[]> resultList) {
if (pre.size() == length) {
resultList.add(pre.toArray(new Integer[0]));
} else {
for (int e : elements) {
List<Integer> newPre = new LinkedList<Integer>(pre);
newPre.add(e);
construct(elements, newPre, length, resultList);
}
}
}
投机取巧版本:
public static void main(String[] args) {
int length = 4;
for (int i = 0, max = (int) Math.pow(2, length); i < max; i++) {
int[] result = new int[length];
int num = i;
for (int j = length - 1; j >= 0; j--) {
result[j] = num & 1;
num = num >> 1;
}
System.out.println(Arrays.toString(result));
}
}

㈦ 用java语言把abcd的全排列算法(递归),改成非递归求全排列,递归算法如下: public

最快能想到的就是用四重循环实现。

㈧ java全排列算法的解释,谁能给我比较前面的解释下全排列算法啊,看了很多,不是很明白,

排序的作用可以让一组元数据按照关键字进行排序,排序好的可以快速查找相关记录
【衡量算法优劣】
①时间复杂度
主要分析关键字的比较次数和记录的移动次数
②空间复杂度
分析排序需要的辅助内存
③稳定性
若记录A和记录B的数值相等,排序后的位置不变,则稳定;反之,则不稳定
【分类】
(1)内部排序(常用10种)
①冒泡(交换)
②快速(交换)
③直接选择(选择)
④堆排序(选择)
⑤直接插入(插入)
⑥折半插入(插入)
⑦希尔排序(插入)
⑧归并排序
⑨桶式排序
(10)基数排序
(2)外部排序
数据量巨大时使用,内存无法保存所有排序数据,需要借助外部存储设备,如磁盘等,常用多路归并排序。
留个邮箱,我把我写的排序算法代码发给你

㈨ java 全排列算法;

= =~思路什么的...用递归吧:

package mon_11;

import java.util.HashSet;

public class ArrangeAll {
private static HashSet<String> set = new HashSet<String>();

public static void arrangeAll(String s) {
put(new StringBuilder(s), new StringBuilder());
}

static void put(StringBuilder s1, StringBuilder s2) {
if (s1.length() == 0)set.add(s2.toString());
for (int i = 0; i < s1.length(); i++) {
put(new StringBuilder(s1).deleteCharAt(i),new StringBuilder(s2).append(s1.charAt(i)));
}
}

public static void main(String[] args) {
arrangeAll("abcd");
System.out.println(set);
}
}
----
输出:
[dcab, acdb, acbd, bcda, bdca, bdac, dbca, bacd, cabd, cdba, cdab, badc, dabc, cadb, dbac, bcad, dacb, cbda, cbad, adbc, adcb, abcd, abdc, dcba]

㈩ Java数组的全排列,里面布尔类型的数组vis[ ],在递归算法里起了什么作用,递归那块理解不了,求详细解答

不要急于看代码,你心理要知道全排列的思路,不注重思路是很多程序员易犯的错误。
全排列算法:
如果我求得固定第一位后的排列,那么全部排列就可以求出,固定第一位有10种可能,可以循环求得。
如果我求得固定第二位后的排列,固定第一位后的排列就可以求出,固定第二位有9种可能,可以循环求得。
。。。
如果我求得固定第10位后的排列,固定第9位后的排列就可以求出,固定第10位有1种可能,可以循环求得。
这很明显是递归的算法。
static void dfs(int start,int end,int num){//为全部排列的集合,start为数字的位置,end为最后一位,num多余的
if(start==end){//当前的数字位置为最后一位时,说明,一个序列已经生成
for(int i=1;i<end;i++)
System.out.print(a[i]+" ");//输出序列
System.out.println();
}
else{//序列没有生成时
for(int i=1;i<end;i++){
if(vis[i])//i是否在前面使用过
continue;//如果是直接跳过
a[start]=i;//确定start位置的数字,当start为1时就是确定第一位,有10种可能
vis[i]=true;//设置i为已使用状态,避免下一位使用i
dfs(start+1,end,num);//求得确定start位后的全部序列
vis[i]=false;//设置i为未使用状态
}
}

热点内容
弄服务器需要什么语言 发布:2025-07-14 07:54:27 浏览:507
金土火的三才配置是什么意思 发布:2025-07-14 07:51:21 浏览:774
服务器带宽怎么计费 发布:2025-07-14 07:51:16 浏览:831
接龙编程 发布:2025-07-14 07:48:17 浏览:172
oppoa935g配置怎么样 发布:2025-07-14 07:44:47 浏览:777
c语言实训目的 发布:2025-07-14 07:44:43 浏览:691
如何设定三星密码锁 发布:2025-07-14 07:43:15 浏览:365
ftp上的文件太大没法下载 发布:2025-07-14 07:42:33 浏览:691
约战拳皇97如何设置房间密码 发布:2025-07-14 07:41:44 浏览:66
全新jeep大指挥官选哪个配置 发布:2025-07-14 07:41:40 浏览:663