📅  最后修改于: 2023-12-03 14:41:13.108000             🧑  作者: Mango
Fisher-Yates Shuffle 算法也被称为 Knuth Shuffle 算法,是一种用于将数组或列表中的元素随机排序的算法。该算法的时间复杂度为 O(n),其中 n 是要洗牌的元素个数。
Fisher-Yates Shuffle 算法的原理非常简单,它通过遍历数组中的每一个元素,将当前元素与数组中的一个随机位置的元素进行交换,从而实现洗牌的效果。具体步骤如下:
通过以上步骤,我们可以保证遍历到的元素都可以与它后面的任意元素进行交换,从而达到随机排序的效果。
下面是 Fisher-Yates Shuffle 算法的 C++ 实现:
#include <iostream>
#include <vector>
#include <random>
void fisherYatesShuffle(std::vector<int>& nums) {
int n = nums.size();
std::random_device rd;
std::mt19937 gen(rd());
for (int i = n - 1; i > 0; --i) {
std::uniform_int_distribution<int> dis(0, i);
int j = dis(gen);
std::swap(nums[i], nums[j]);
}
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
fisherYatesShuffle(nums);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
以上代码中,我们使用了 <random>
头文件中的随机数生成器 std::mt19937
和 std::uniform_int_distribution
来生成随机索引。通过调用 std::swap()
函数来交换元素。最后我们在 main()
函数中演示了如何使用该算法对一个整数数组进行洗牌,并输出结果。
Fisher-Yates Shuffle 算法是一种简单且高效的洗牌算法,通过利用随机数生成器,可以将数组或列表中的元素随机排序。它的时间复杂度为 O(n),适用于各种编程语言和数据结构。