Knuth-Shuffle (Fisher-Yates) 演示

从数学原理到内存交换的完美随机洗牌算法体验

内存数组状态

观察“未洗牌区”的收缩与元素的交换

播放速度:

逻辑切分与状态映射

Knuth-Shuffle的核心在于将数组分为前段的“未洗牌区”和后段的“已洗牌区”。在每次迭代中,从“未洗牌区”均匀选取一个元素(可能包含它自身),将其置换到分界线上,并冻结进入“已洗牌区”。这种机制使得系统可能产生的路径总数恰好等于排列组合数 N!,完美契合了双射理论。

fisher_yates.c O(N) 时间复杂度
for (int i = n - 1; i > 0; i--) {
// 随机截断边界:0 到 i
int j = rand() % (i + 1);
// 元素交换
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

当前执行状态跟踪