weixin_42495952
weixin_42495952
2011-12-29 19:09

java中的排序问题

已采纳

1,2,2,3,4按不同顺序排列,把每个组合输出用java怎么写啊?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • iteye_16709 iteye_16709 10年前

    采用插入算法实现排列:
    [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]
    代码就是就是上面的,具体解释等我有时间了给你解释

    点赞 评论 复制链接分享
  • u011606457 _1_1_7_ 10年前

    你是要全排列的功能还是要乱序的功能????

    点赞 评论 复制链接分享
  • weixin_42569100 重口味恋 •上小清新 10年前

    [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)

    点赞 评论 复制链接分享
  • carvin_happy carvin_happy 10年前

    Java排列组合算法:[url]http://blog.csdn.net/guo_rui22/article/details/2199732 [/url]

    点赞 评论 复制链接分享
  • carvin_happy carvin_happy 10年前

    你参考一下这个吧:Java排列组合算法[code="java"]http://blog.csdn.net/guo_rui22/article/details/2199732[/code]

    点赞 评论 复制链接分享
  • iteye_16709 iteye_16709 10年前

    兄弟,我明白你的意思了 你想要的不是排序,而是组合。这个需要自己写程序。如果不会可以把你的需求再详细些 我给你写一个。

    点赞 评论 复制链接分享
  • iteye_16709 iteye_16709 10年前

    排序从功能的角度来说,分为:升序(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]
    不过这个默认是升序 的 降序的需要自己写。

    点赞 评论 复制链接分享

相关推荐