使用顺序 for 循环的数组洗牌方法

Array shuffle method using sequential for-loops

我正在尝试为纸牌游戏程序编写 shuffle 方法。该方法的工作原理是将一副牌分成两半,然后将交替两半的牌交错放置。问题是,该方法只是保持数组原样。没有洗牌。

/**
     * Apply a "perfect shuffle" to the argument.
     * The perfect shuffle algorithm splits the deck in half, then interleaves
     * the cards in one half with the cards in the other.
     * @param values is an array of integers simulating cards to be shuffled.
     */
    public static void perfectShuffle(int[] values) {
        int[] shuffled = new int[values.length];
        int k = 0;
        for (int j = 0; j < (values.length + 1) / 2; j++){
           shuffled[k] = values[j];
           k += 2;
        }
        k = 1;
        for (int j = (values.length + 1) / 2; j < values.length; j++){
            shuffled[k] = values[j];
            k += 2;
        }
        values = shuffled;
    }

错误在哪里?

您没有使用 shuffled 数组的元素重新填充原始数组 values

values = shuffled; 不会复制 shuffled 并为其赋值。假设值数组是一个全局变量, 您应该手动执行此操作:

for(int i =0;i<shuffled.length();i++) values[i] = shuffled[i];

因为Java passes everything by value,你需要returnshuffled并将values分配给错误命名方法return的值perfectShuffle() :

public static int[] perfectShuffle(int[] values) {
    int[] shuffled = new int[values.length];
    int k = 0;
    for (int j = 0; j < (values.length + 1) / 2; j++) {
        shuffled[k] = values[j];
        k += 2;
    }
    k = 1;
    for (int j = (values.length + 1) / 2; j < values.length; j++) {
        shuffled[k] = values[j];
        k += 2;
    }
    return shuffled;
}

public static void main(String[] args) {
    int[] values = { 1, 2, 3, 4, 5 };
    int[] shuffled = perfectShuffle(values);
    // ...
}