【第21題】數組隨機排序的三種方法

題目描述

給定一個數組,對其進行隨機排序。示例以下:前端

// 示例
輸入:[0, 2, 4, 8, 1, 3, 5, 8]

// 由於是隨機排序,輸出結果不惟一
輸出:[3, 0, 4, 5, 8, 2, 8, 1]
複製代碼

答案解析

這道題目在面試中也是常考的,變相考察思惟邏輯、數組操做API的熟練程度等方面,題目難度爲Easy。面試

我能想到的應用場景就是:接口返回若干道題目,但願每次進入頁面,題目的展現順序是隨機的。算法

下面用三種方法,實現數組隨機排序,三種方法各有優劣,涉及的知識點也有所不一樣。數組

1. 利用數組自帶的sort方法bash

let ary = [0, 2, 4, 8, 1, 3, 5, 8];
function order(ary) {
    let cloneAry = ary.concat();
    cloneAry.sort((a, b) => {
        return Math.random() - 0.5
    })
    return cloneAry;
}

複製代碼

這種方法是利用隨機出一個正數或者負數來讓數組裏面的內容兩兩對比,是正數就是順序,是負數則是倒序,這種方法的缺點就是隨機性不高,不能徹底隨機,由於是兩兩對比,因此最後一個數在最後的可能性較大。dom

2. 利用循環遍歷ui

let ary = [0, 2, 4, 8, 1, 3, 5, 8];
function order(ary) {
    let cloneAry = ary.concat();
    let result = [];
    
    while(cloneAry.length > 0) {
        let index = Math.floor(Math.random() * cloneAry.length);
        let item = cloneAry.splice(index, 1);
        result.push(item);
    }
    return result;
}
複製代碼

這種方法定義一個隨機數index(由於定了向下取整,因此範圍爲0~ary.length)做爲隨機下標,而後將它對應的數從數組中取下壓入到result數組中,從而實現隨機排序,若是cloneArr的長度爲空的話,則退出循環,這種隨機的隨機性很好,可是代碼新建立了一個數組,空間複雜度較高。spa

3. 洗牌算法(推薦)code

let ary = [0, 2, 4, 8, 1, 3, 5, 8];
function order(ary) {
    let cloneAry = ary.concat();
    let len = cloneAry.length;
    for(let i = 0; i < len; i++) {
        let index = Math.floor(Math.random() * cloneAry.length);
        [cloneAry[i], clone[index]] = [cloneAry[index], clone[i]]
    }
    return cloneAry;
}
複製代碼

洗牌算法呢是利用隨機出的index下標對應的數,與數組從前到後相互切換,因此稱爲洗牌,代碼運行效率相比前面幾種高,隨機性也很大,空間複雜度也較低。orm

關注我

掃一掃 關注個人公衆號【前端名獅】,更多精彩內容陪伴你!

相關文章
相關標籤/搜索