java编写全排列代码 全排列java实现

JAVA 全排列算法

递归实现,取数字(字符串)中第i个位置的字符,然后将他和剩余的字符拼接,剩余的字符串当成有一个全排列的输入,这样递归下去,只剩一个字符时全排列就是本身。程序中使用set去除了重复的数据,如果需要保留,将set换为list接口即可。

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了鄱阳免费建站欢迎大家使用!

package mytest;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

/*

* @date:2012-2-8

* @author:

*

* 输入一个数字,讲输出 1到这个数字的全排列

*/

public class MyDemo2 {

private static SetString SET_STRING = new HashSetString();

private static SetLong SET_NUM = new HashSetLong();

public static void main(String[] args) {

System.out.println("begin ...... ");

testLong(234);

testString("a23");

print(SET_NUM);

print(SET_STRING);

System.out.println("end ...... ");

}

/**

* 测试数字

* @param num

*/

private static void testLong(long num){

long testNum = num;

String[] permutation;

for(long l=0; l=testNum; l++){

permutation = getAllOrder(String.valueOf(l));

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

SET_NUM.add(Long.valueOf(permutation[i]));

}

}

}

/**

* 测试字符串

* @param str

*/

private static void testString(String str){

String[] permutation = getAllOrder(str);

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

SET_STRING.add(permutation[i]);

}

}

private static void print(Set set){

System.out.println("/*****************************************************/");

int i=0;

for(Iterator it = set.iterator(); it.hasNext();){

i++;

if(i%10 == 0){

System.out.println();

}

System.out.print(it.next() + " ");

}

System.out.println();

System.out.println("/*****************************************************/");

}

/**

* 递归算法 全排列 去除重复

* @param str

* @return

*/

private static String[] getAllOrder(String str) {

String [] arrResult = null;

SetString set = new HashSetString();

if(str.length()1){

String result = "";

String charXInString;

String remainString;

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

charXInString = str.charAt(i) + "";

remainString = str.substring(0, i)+ str.substring(i + 1, str.length());

for (String element : getAllOrder(remainString)) {

result = charXInString + element;

set.add(result);

}

}

arrResult = set.toArray(new String[set.size()]);

}else{

arrResult = new String[]{str};

}

return arrResult;

}

}

java怎么搞全排列

尽量用递归好理解一些,打个断点

public class Permutation {

public static void permulation(int[] list, int start, int length) {

int i;

if (start == length) {

for (i = 0; i length; i++)

System.out.print(list[i] + " ");

System.out.println();

} else {

for (i = start; i length; i++) {

swap(list, start, i);

permulation(list, start + 1, length);

swap(list, start, i);

}

}

}

public static void swap(int[] list, int start, int i) {

int temp;

temp = list;

list = list[i];

list[i] = temp;

}

public static void main(String[] args) {

int length = 3;

int start = 0;

int list[] = new int[length];

for (int j = 0; j length; j++)

list[j] = j + 1;

permulation(list, start, length);

}

}

java 全排列算法;

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

package mon_11;

import java.util.HashSet;

public class ArrangeAll {

private static HashSetString set = new HashSetString();

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编程技巧:列表排序代码分析

在Java Collection Framework中定义的List实现有Vector ArrayList和LinkedList 这些集合提供了对对象组的索引访问 他们提供了元素的添加与删除支持 然而 它们并没有内置的元素排序支持 你能够使用java util Collections类中的sort()方法对List元素进行排序 你既可以给方法传递一个List对象 也可以传递一个List和一个Comparator 如果列表中的元素全都是相同类型的类 并且这个类实现了Comparable接口 你可以简单的调用Collections sort() 如果这个类没有实现Comparator 你也可以传递一个Comparator到方法sort()中 进行排序 如果你不想使用缺省的分类顺序进行排序 你同样可以传递一个Comparator到方法sort()中来进行排序 如果列表中的元素并不都是相同类型的类 你在进行排序的时候就不是这样幸运了 除非你编写一个专用的跨类的Comparator 排序的顺序怎么样呢?如果元素是String对象 却省的排序顺序是按照字符编码进行的 基本上是每个字符的ASCII/Unicode值 如果严格的限制在处理英文 却省的排序顺序通常是足够的 因为它首先排A Z 然后是小写字母a z 然而如果你处理非英文字 或者你只是想使用不同的排序顺序 这样Collections sort()就出现了第二种变化 例如 你想使用字符串的反序进行排序 为了实现这个功能 你可以在Collections类中通过reverseOrder()来获取一个反序Comparator 然后 你将反序Comparator传递给sort()方法 换句话说 你作如下工作 List list = ;Comparator p = Collections reverseOrder();Collections sort(list p); 如果列表包含项目 Man man Woman 和woman 排序好的列表将是Man Woman man woman 这里没有什么复杂的 需要注意的非常重要的一点是Collections sort()是进行原位排序 如果你需要保留原序 需要先对原集合进行复制 在排序 就像这样 List list = ;List copyOfList = new ArrayList(list);Collections sort(copyOfList); 这里 排好序的列表是 Man Woman man woman 但是原始列表(Man man Woman woman)被保留了 到目前为止 排序是区分大小写的 你如何进行不去分大小写的排序呢?一种实现方式是象这样实现Comparator: public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}} 你确实不需要手工的创建这个类 而是 你可以是用以存在的Comparator CASE_INSENSIVTIVE_ORDER 它是在String类中定义的 这种实现方式有一点小小的问题 Sort()算法提供稳定的排序 并保持与原有序列相同的元素 这意味着一个包含两个元素 woman 和 Woman 的列表将有不同的排序 而这种不同是根据两个元素在列表中出现的先后次序决定的 语言的不同又会怎么样呢?java text包提供了Collector和CollectionKey类来进行区分语言的排序 这里是例子:注意 如果你的文本是本地语言 而不是缺省语言 你需要传递一个本地语种给getInstance()方法 就象: public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}} 你是在对集合关键字进行排序 而不是实际的字符串 这不仅提供固定的不区分大小写的排序 而且它是跨语种的排序 换句话说 如果你对西班牙文和非西班牙文的混合词进行排序 词ma?ana (tomorrow)将排在mantra的前面 如果你不使用Collector ma?ana将排在mantra的后面 下面这个程序对一个列表进行不同类型的排序(缺省的 区分大小写的 区分语种的) import java awt BorderLayout;import java awt Container;import java io *;import java text *;import java util *;import javax swing *;public class SortIt {public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}}public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}}public static void main(String args[]) {String words[] = { man Man Woman woman Manana manana ma?ana Ma?ana Mantra mantra mantel Mantel };// Create frame to display sortingsJFrame frame = new JFrame( Sorting );frame setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);Container contentPane = frame getContentPane();JTextArea textArea = new JTextArea();JScrollPane pane = new JScrollPane(textArea);contentPane add(pane BorderLayout CENTER);// Create buffer for outputStringWriter buffer = new StringWriter();PrintWriter out = new PrintWriter(buffer);// Create initial list to sortList list = new ArrayList(Arrays asList(words));out println( Original list: );out println(list);out println();// Perform default sortCollections sort(list);out println( Default sorting: );out println(list);out println();// Reset list list = new ArrayList(Arrays asList(words));// Perform case insensitive sortComparator p = new CaseInsensitiveComparator();Collections sort(list p);out println( Case insensitive sorting: );out println(list);out println();// Reset listlist = new ArrayList(Arrays asList(words));// Perform collation sortp = new CollatorComparator();Collections sort(list p);out println( Collator sorting: );out println(list);out println();// Fill text area and displaytextArea setText(buffer toString());frame pack();frame show();}} 如果你的主要问题是顺序访问 可能列表不是你的好的数据结构选择 只要你的集合没有重复 你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator) 这样 元素将总是排序形式的 lishixinzhi/Article/program/Java/hx/201311/26066

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中,用递归方法求n个数的无重复全排列,n=3。

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

5

3 1 2 1 2

第一行是数字个数,第二行有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]表示第i个元素是否已使用

int[] cur;        // 保存当前的排列数

// 递归打印无重复全排列,当前打印到第idx位

void print_comb(int idx) {

if(idx == n) {    // idx == n时,表示可以将cur输出

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

if(i  0) System.out.print(" ");

System.out.print(cur[i]);

}

System.out.println();

}

int last = -1;                            // 因为要求无重复,所以last表示上一次搜索的值

for(int i = 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;

}

}

}

public void go() throws FileNotFoundException

{

Scanner in = new Scanner(new File("data.in"));

// 读取数据并排序

n = in.nextInt();

a = new int[n];

for(int i = 0; i  n; ++i) a[i] = in.nextInt();

Arrays.sort(a);

// 初始化辅助变量并开始无重复全排列

cur = new int[n];

used = new boolean[n];

for(int i = 0; i  n; ++i) used[i] = false;

print_comb(0);

in.close();

}

public static void main(String[] args) throws FileNotFoundException{

new Main().go();

}

}

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


本文题目:java编写全排列代码 全排列java实现
标题来源:http://hbruida.cn/article/hgcehg.html