1. 程式人生 > >Javarscipt中數組或者字符串的隨機排序方法

Javarscipt中數組或者字符串的隨機排序方法

++ 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中數組或者字符串的隨機排序方法