javaScript隨機排序演算法

沈鑫Real發表於2018-07-20
let arr = ["1","2", "3", "4", "5", "6", "7", "8"]
let length = arr.length
let random = 0
let resultList = []
while(length > 0) {
    random = parseInt(Math.random() * length)
    resultList.push(arr[random])
    arr.splice(random, 1)
    length--
}
console.log("resultList is : " + resultList)
複製程式碼

Result:

resultList is : 2,4,1,6,5,8,7,3
複製程式碼

但是之前好像看過有人噴阮一峰老師的一個演算法,說splice的時間複雜度太高,降低了演算法的效能,所以如果希望提高此演算法的效能,建議自己實現從一個陣列中刪除一個元素的操作。

這裡我給出一種思路:

因為我們是隨機排序所以並不在乎陣列中元素的位置。我們可以每次取出一個指定位子的數值之後,將最後一個元素複製到取出元素的位子,將原資料覆蓋。

又因為我們每次length都會減1所以最後面的元素在下次隨機取數時並不會被取到,所以即使陣列的實際大小並沒有改變,對我們的演算法也不會造成影響。

程式碼如下:

let arr = ["1","2", "3", "4", "5", "6", "7", "8"]
let length = arr.length
let random = 0
let resultList = []
while(length > 0) {
    random = parseInt(Math.random() * length)
    resultList.push(arr[random])
    arr[random] = arr[--length]
}
console.log("resultList is : " + resultList)
複製程式碼

注意length的長度與陣列的序號之間的差異。

相關文章