Java 中洗牌数组

10 Sept 2024 | 4 分钟阅读

在编程世界中,操作数组是一项基本技能。数组可以被乱序,包括随机重排其元素,这是一种常见的处理过程。这个过程对于构建随机化的游戏牌组、运行统计模拟或仅仅是更随机地显示数据至关重要。最初,我们可以应用很多逻辑来乱序数组;我们可以使用不同类型的集合框架,如 ArrayList、hash sets、linked lists 等。数组的乱序可以通过不同的方式完成,而且

乱序数组的算法

以下是乱序数组的算法:

步骤 1: 开始

步骤 2: 从数组的最后一个元素开始,向第一个元素倒序遍历。

步骤 3: 对于索引为 i 的每个元素,生成一个随机索引 j,其中 j 在范围 [0, i] 内。

步骤 4: 交换索引 i 和 j 处的元素。

步骤 5: 对数组中的所有元素重复步骤 2 和 3,从最后一个元素向第一个元素倒序遍历。

步骤 6: 结束

我们可以乱序包含整数、字符等不同类型元素的数组。

Fisher-Yates 乱序算法

以下 Java 程序用于乱序一个由整数组成的数组。

ArrayShuffle.java

输出

1 3 2 4 5

如果您在自己的系统上执行,输出可能会有所不同,因为它会随机排列元素并输出乱序后的数组。

复杂度

乱序算法的空间复杂度为 O(1),因为它不使用任何取决于数组大小的额外数据结构。shuffleArray() 方法中使用的 Fisher-Yates 乱序算法的时间复杂度为 O(n),其中 n 是数组中的元素数量。

使用 List 在 Java 中乱序数组

ShuffleArray.java

输出

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

如果您在自己的系统上执行,输出可能会有所不同,因为它会随机排列元素并输出乱序后的数组。

复杂度

空间复杂度也为 O(n)。这是因为 Collections.shuffle() 方法会就地修改原始列表,而不使用任何其他额外的数据结构。此代码的时间复杂度为 O(n),其中 n 是数组中的元素数量。

乱序字符数组

ShuffleCharacters.java

输出

Shuffled Characters: [e, f, g, d, a, c, b]

如果您在自己的系统上执行,输出可能会有所不同,因为它会随机排列元素并输出乱序后的数组。

复杂度

乱序算法的空间复杂度为 O(1),因为它不使用任何取决于数组大小的额外数据结构。shuffleArray() 方法中使用的程序的 time complexity 为 O(n),其中 n 是数组中的字符数量。

结论

在 Java 中乱序数组是一项至关重要的技能,它使开发人员能够创建随机且无偏见的数据排列。在本探索过程中,我们涵盖了两种有效的方法:对于非原始数组,使用 Collections.shuffle() 方法;对于原始数组,实现 Fisher-Yates 乱序算法。Collections.shuffle() 方法通过利用内置功能,简化了对象或非原始数组的乱序过程。另一方面,Fisher-Yates 算法提供了一种高效且无偏见的方式来乱序原始数组,确保了排列的均匀性。