实现乱序函数?(面试常考)
// v1. 基本的实现
var values = [1, 2, 3, 4, 5];
values.sort(function () {
// Math.random() - 0.5 随机得到一个正数、负数或是 0,如果是正数则降序排列,如果是负数则升序排列,如果是 0 就不变,然后不断的升序或者降序,最终得到一个乱序的数组。
return Math.random() - 0.5;
})
// test
var times = [0, 0, 0, 0, 0];
for (var i = 0; i < 100000; i++) {
let arr = [1, 2, 3, 4, 5];
arr.sort(() => Math.random() - 0.5);
times[arr[4]-1]++;
}
console.log(times)
// 插入排序
function insertSort(a, from, to) {
}
// v2: 乱序算法加强版
function shuffle(arr) {
for (let i = arr.length; i > 0; i--) {
// 遍历数组元素,然后将当前元素与以后随机位置的元素进行交换
let j = Math.floor(Math.random() * i);
// arr[i - 1] 就是当前的这个arr数组的最后一个元素
[arr[i - 1], arr[j]] = [arr[j], arr[j - 1]];
}
}
[!NOTE] v8 为例,v8 在处理 sort 方法时,当目标数组长度小于 10 时,使用插入排序;反之,使用快速排序和插入排序的混合排序。