Javarscipt中數組或者字符串的隨機排序方法
阿新 • • 發佈:2018-03-25
++ OS 排序 復雜度 方案 [] led i++ pan
在日常開發中,經常會遇到隨機排序的需求,思路就是利用Math.random()方法,抽取隨機數,讓數組中的元素進行對調;
話不多說直接上代碼,方法一:基本思路就是將a中隨機抽取一個元素,放入b中,再從a中刪除這個被抽中的元素,時間復雜度為a的長度平方,因為要遍歷兩次a
1 function shuffle(a) {
2 var b = [];
3 while (a.length > 0) {
4 var index = parseInt(Math.random() * (a.length - 1));
5 b.push(a[index]);
6 a.splice(index, 1);
7 }
8 return b;
9 };
10
11 var arr = [1,2,3,4,5];
12
13 shuffle(arr); //輸出[2,5,4,1,3];
第二種方法:利用數組元素交換的方法;只遍歷一次數組,時間復雜度為數組的長度
function shuffle(a) {
var len = a.length;
for (var i = 0; i < len - 1; i++) {
var index = parseInt(Math.random() * (len - i));
var temp = a[index];
a[index] = a[len - i - 1];
a[len - i - 1] = temp;
}
}
var arr = [1,2,3,4,5];
shuffle(arr); //輸出[2,5,4,1,3];
另一種和上面類似的方案:
1 function shuffle(a){
2 var i, j,temp;
3 for (i = arr.length - 1; i > 0; i--) {
4 j = Math.floor(Math.random() * (i + 1));
5 temp = arr[i];
6 arr[i] = arr[j];
7 arr[j] = temp;
8 }
9 return arr;
10 }
這樣就可以提取出在原型鏈上的方法:
1 Array.prototype.shuffle = function(){
2 var len = this.length;
3 for(var i=0;i<len-1;i++){
4 var index = parseInt(Math.random()*(len-i));
5 var temp = this[index];
6 this[index] = this[len-i-1];
7 this[len-i-1] = temp;
8 }
9
10 return this;
11 }
最後分享一種underscore.js中的方法,
1 function random(min, max) {
2 if (max == null) {
3 max = min;
4 min = 0;
5 }
6 return min + Math.floor(Math.random() * (max - min + 1));
7 };
8
9
10 function shuffle(arr) {
11 var length = arr.length,shuffled = Array(length);
12
13 for (var index = 0; index < length; index++) {
14 var rand = random(0, index);
15
16 if (rand !== index) {
17 shuffled[index] = shuffled[rand];
18 }
19 shuffled[rand] = arr[index];
20 }
21 return shuffled;
22 }
Javarscipt中數組或者字符串的隨機排序方法