1,2,2,3,4按不同顺序排列,把每个组合输出用java怎么写啊?
采用插入算法实现排列:
[code="java"]
public class Composition {
char [][] insert(char [] a,char b) {
int row = a.length+1;
int col = row ;
int insertPos = 0;//插入位置
char [][] r = new char[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if(j < insertPos) {
r[i][j] = a[j];
} else if(j > insertPos ){
r[i][j] = a[j-1];
} else {
r[i][j] = b;
}
}
insertPos++;
}
return r;
}
char [][] composition(char [] c) {
char [][] r = {{c[0]}};
char [][][] d ;
int ii;
for (int i = 1; i < c.length; i++) {
d = new char[r.length][0][0];
for (int j = 0; j < r.length; j++) {
d[j]=insert(r[j],c[i]);
}
r = new char[d.length*d[0].length][0];
ii = 0;
for (int j = 0; j < d.length; j++) {
for (int j2 = 0; j2 < d[j].length; j2++) {
r[ii++] = d[j][j2];
}
}
}
return r;
}
public static void main(String[] args) {
Composition com = new Composition();
// new char[]{'1','2','3','4','2','2'}
// new char[]{'1','2','3','4','2','2','2'}
char [][] r = com.composition(new char[]{'1','2','3','4','2'});
Set set = new HashSet();
System.out.println(r.length);
for (int i = 0; i < r.length; i++) {
set.add(new String(r[i]));
// System.out.println(r[i]);
}
System.out.println(set.size());
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
[/code]
代码就是就是上面的,具体解释等我有时间了给你解释
排序从功能的角度来说,分为:升序(asd),降序(desc)
从排序的方法来说可以分为:
1.插入排序:简单插入排序,二路插入排序
2.交换排序:冒泡排序,快速排序
3.选择排序:选择排序,堆排序
4.其他排序方法。
在java中对于整数提供了排序API
java.util.Arrays
</[code="java"]
int [] a = new int[] {2,3,1,4,2};
[/code]
直接调用方法sort就可以
</[code="java"]
a = Arrays.sort(a);
[/code]
不过这个默认是升序 的 降序的需要自己写。
兄弟,我明白你的意思了 你想要的不是排序,而是组合。这个需要自己写程序。如果不会可以把你的需求再详细些 我给你写一个。
你参考一下这个吧:Java排列组合算法[code="java"]http://blog.csdn.net/guo_rui22/article/details/2199732[/code]
Java排列组合算法:[url]http://blog.csdn.net/guo_rui22/article/details/2199732 [/url]
[code="java"]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PrintAll {
private int[] arr;
public PrintAll(int[] arr) {
Arrays.sort(arr);
this.arr = arr;
}
public int[][] execute() {
return execute0(arr);
}
private int[][] execute0(int[] array) {
if (array.length == 1)
return new int[][] { array };
// number --> 任意一个 index
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < array.length; ++i) {
if (map.get(array[i]) == null) {
map.put(array[i], i);
}
}
if (map.size() == 1) { // all same like {2,2,2,2}
return new int[][] { array };
} else {
List<int[][]> res = new ArrayList<int[][]>();
for (Integer key : map.keySet()) {
int index = map.get(key);
int[] newarray = new int[array.length - 1];
// newarray 是从 array 去掉index位置元素所得到的新数组
System.arraycopy(array, 0, newarray, 0, index);
System.arraycopy(array, index + 1, newarray, index,array.length - index - 1);
// 递归
int[][] _result = execute0(newarray);
int[][] all = addfirst(key, _result);
res.add(all);
}
if (res.size() == 1) {
return res.get(0);
} else {
int size = 0;
for (int i = 0; i < res.size(); ++i) {
size += res.get(i).length;
}
int[][] result = new int[size][];
int start = 0;
for (int i = 0; i < res.size(); ++i) {
int[][] tmp = res.get(i);
System.arraycopy(tmp, 0, result, start, tmp.length);
start += tmp.length;
}
return result;
}
}
}
// 将first添加到last中每一个的头部
private int[][] addfirst(int first, int[][] last) {
int[][] result = new int[last.length][];
for (int i = 0; i < result.length; ++i) {
int[] old = last[i];
int[] newone = new int[old.length + 1];
newone[0] = first;
System.arraycopy(last[i], 0, newone, 1, old.length);
result[i] = newone;
}
return result;
}
public static void main(String[] args) {
int[] test = new int[] { 1, 2, 2, 3, 4 };
PrintAll comp = new PrintAll(test);
int[][] result = comp.execute();
for (int i = 0; i < result.length; ++i) {
System.out.println(Arrays.toString(result[i]));
}
}
}
[/code]
递归的, 比较好写; 不保证时间和空间效率很高. 8)
你是要全排列的功能还是要乱序的功能????