javaScript随机排序算法

1,123 阅读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.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的长度与数组的序号之间的差异。