for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (a[j] > a[j+1]) {
swap(a[j], a[j+1]);
}
}
}
✅ JavaScript(我们的工具)
for (let i = 0; i < n-1; i++) {
for (let j = 0; j < n-i-1; j++) {
compare(j, j+1);
if (a[j] > a[j+1]) {
swap(j, j+1);
}
}
}
📌 区别:compare 显示比较动画,swap 显示交换动画
⚠️ 6. 常见错误(C++用户容易犯的)
❌ 忘记写 let:for (i = 0; i < n; i++) → 错误,应写 for (let i = 0; i < n; i++)
❌ compare 里修改数组:compare 只负责显示绿色,不能写 a[i] = a[j]
❌ 使用 a.size():JavaScript 是 a.length(不是函数)
❌ 用 cout 或 printf:浏览器里用 console.log()
❌ 忘记分号:JavaScript 可以不加分号(但建议加上)
🎲 7. 随机数生成指南(重要!)
⚠️ C++ 的 rand() 在 JavaScript 中不存在!
C++ vs JavaScript 随机数对比
C++
JavaScript
说明
rand()
Math.random()
核心随机函数
rand() % 100
Math.floor(Math.random() * 100)
生成 0~99 的整数
rand() % 100 + 1
Math.floor(Math.random() * 100) + 1
生成 1~100 的整数
srand(time(0))
✅ 不需要!自动随机
JS 自动初始化种子
📝 常用随机数公式
// 生成 0 到 max-1 的随机整数
let x = Math.floor(Math.random() * max);
// 生成 min 到 max 的随机整数(包含两端)
let x = Math.floor(Math.random() * (max - min + 1)) + min;
// 生成 0 到 1 的随机小数
let x = Math.random();
// 随机打乱数组(Fisher-Yates洗牌)
for (let i = a.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]]; // 交换
}
✅ 在灭霸排序中的应用
// 随机选择一半元素删除
let snapCount = Math.floor(aliveCount / 2);
let aliveIndices = [];
for (let i = 0; i < n; i++) if (active[i]) aliveIndices.push(i);
// 随机打乱索引
for (let i = aliveIndices.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[aliveIndices[i], aliveIndices[j]] = [aliveIndices[j], aliveIndices[i]];
}
// 取前 snapCount 个删除
let toRemove = aliveIndices.slice(0, snapCount);