如何在JavaScript中随机置换数组?

时间:2012-08-20 08:13:23

标签: javascript jquery random sorting

  

可能重复:
  How to randomize a javascript array?

我需要从数组中实现随机二叉搜索树(R-BST),以便排序后的数组得到O(n lg n)平均时间而不是O(n ^ 2),这是最坏的情况时间如果数组已经排序或反向排序。现在这两个步骤是:

  1. 随机置换数组A.
  2. 致电BST排序(A)。
  3. 如何进行第一步JavaScript?我想要它,以便每个n!排列同样可能发生。我相信在Java中执行此操作的方法是Collections.shuffle,例如:

    Integer[] arr = new Integer[10]; 
    
    for (int i = 0; i < arr.length; i++) { 
        arr[i] = i; 
    } 
    
    Collections.shuffle(Arrays.asList(arr)); 
    
    for (int i = 0; i < arr.length; i++) { 
        System.out.print(arr[i] + " "); 
    } 
    

    我如何在Javascript中执行此操作?我可以使用jQuery。

2 个答案:

答案 0 :(得分:1)

只需将.sort与随机比较器一起使用:

var comparer = function(a,b) {
    return 2 * Math.random() - 1;
}
array.sort( comparer );

编辑由于有些人对解决方案不满意,所以这里有更经典的方法:

Array.prototype.shuffle = function() {
    var result = [];
    while( this.length ) {
        var index = Math.floor( this.length * Math.random() );
        result.push( this[ index ] );
        this.splice(index, 1);
    }
    return result;
};

答案 1 :(得分:-1)

您可以使用shuffle函数扩展Array原型:

Array.prototype.shuffle = function() {
  var tmp, rand;
  for(var i =0; i < this.length; i++){
    rand = Math.floor(Math.random() * this.length);
    tmp = this[i]; 
    this[i] = this[rand]; 
    this[rand] = tmp;
  }
}

然后在任何数组上调用shuffle来进行就地排序:

var arr = [1,2,3,4];
arr.shuffle();
console.log(arr);