📌  相关文章
📜  通过交换相邻元素来打乱每个 Array 元素的位置(1)

📅  最后修改于: 2023-12-03 14:58:03.348000             🧑  作者: Mango

通过交换相邻元素来打乱每个 Array 元素的位置

在编写程序时,有时需要对数组中的元素进行随机排序。一种有效的方法是通过交换相邻元素来打乱每个 Array 元素的位置。本文将向你介绍如何实现这个功能。

方法一:Fisher-Yates 算法

Fisher-Yates 算法是一种简单而广泛使用的随机排列算法。它的基本思路是从数组末尾开始,逐个随机选取一个元素与数组中随机位置的一个元素进行交换。这种交换方式可以确保每个元素被重复随机一次,从而实现了随机打乱数组的效果。

以下是该算法的代码实现:

import random

def shuffle(arr):
    n = len(arr)
    for i in range(n-1, 0, -1):
        j = random.randint(0, i)
        arr[i], arr[j] = arr[j], arr[i]
方法二:Knuth 洗牌算法

Knuth 洗牌算法是 Fisher-Yates 算法的一个改进,该算法的时间复杂度为 O(n)。其基本思路是每次从数组中选取一个元素,并将该元素与数组中的任意一个元素进行交换。这种交换方式可以确保每个元素被重复随机一次,并且避免了 Fisher-Yates 算法在索引值随机选择上的一些问题。

以下是该算法的代码实现:

import random

def shuffle(arr):
    n = len(arr)
    for i in range(n):
        j = random.randint(i, n-1)
        arr[i], arr[j] = arr[j], arr[i]
使用方法

调用以上两个函数即可对数组进行随机打乱操作。例如,如果你有一个包含 10 个元素的列表 arr,你可以通过如下方式进行打乱:

shuffle(arr)

打乱后的数组元素顺序将是随机的,而不是原来的顺序。

结论

通过以上介绍的两种交换相邻元素的方法,我们可以轻松地将数组中的元素进行随机打乱,并确保每个元素被重复随机一次。如果你想让你的程序更加高效,可以考虑使用 Knuth 洗牌算法。