实现一种算法来混洗数组

时间:2013-02-12 05:11:25

标签: java

我为以下问题编写了代码,但它们不起作用。我得到随机数,但是随机播放方法不会随机播放。你能帮帮我吗?

for( each index i)

   choose a random index j where j>=i.
   swap the elements at index i and j.

我的代码是:

public static void shuffle(int[] a){
   for( int i = 0; i < a.length-1; i++){
       int range = a.length; 
       int j = (int) (Math.random() * range);
       swap(a, i, j);      
  }
}

public static void swap(int[] array, int i, int j){

        if (i != j) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

2 个答案:

答案 0 :(得分:0)

java.util.Collections.shuffle与List一起使用。我建议从src复制粘贴算法并将其更改为使用int []:

public static void shuffle(int[] a) {
    Random rnd = new Random();
    for (int i = a.length; i > 1; i--) {
        swap(a, i - 1, rnd.nextInt(i));
    }
}

private static void swap(int[] a, int i, int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}


public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    shuffle(a);
    System.out.println(Arrays.toString(a));
}

打印

[8, 7, 3, 4, 6, 1, 2, 5, 9]

答案 1 :(得分:0)

将数组转换为Integer Wrapper类,并通过将Integer数组转换为List来调用Collections.shuffle。该片段位于

之下

您应该可以访问Apache lang库,然后可以像这样使用ArrayUtils.toObject(int [])方法:

int [] array = {1,2,3,4,5,6};
Integer[] newArray = ArrayUtils.toObject(array);
Collections.shuffle(Arrays.asList(newArray));
for (int i = 0; i < newArray.length; i++) {
    System.out.println(newArray[i]);
}

如果您没有Apcahe Lang图书馆,那么您可以这样做

Integer[] newArray = new Integer[array.length];
int i = 0;
for (int value : array) {
    newArray[i++] = Integer.valueOf(value);
}