实现乱序函数?(面试常考)

// 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 时,使用插入排序;反之,使用快速排序和插入排序的混合排序。

results matching ""

    No results matching ""