数组随机排序的算法

今天被问到了一个随机排序的算法,然后去网上查了一下资料 整理如下

数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):
是一种将有限集合的顺序打乱的一种算法

 

1.使用sort排序

var arr = [1,2,3,4,5,6,7,8,9];
arr.sort(function(a, b) {
    return Math.random() > 0.5 ? -1 : 1;
});

   

  2.递归的方法

function randomSort(arr, newArr) {
    if( arr.length == 1 ) {
        newArr.push(arr[0])
        // 相当于递归退出
        return newArr;
    }
    // 在原数组length基础上取出一个随机数
    var random = Math.ceil(Math.random()*arr.length) - 1;
    // 将原数组中的随机一个值push到新数组newArr中
    newArr.push(arr[random]);
    // 对应删除原数组arr的对应数组项
    arr.splice(random, 1);
    return randomSort(arr, newArr);
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newArr = [];
randomSort(arr, newArr);
console.log(newArr);

 

  

 

3.随机交换数组内的元素

 

var range = function(min, max) {
    return min + Math.floor(Math.random()*(max - min + 1));
}
Array.prototype.shuffle = function(n) {
        var len = this.length,
                num = n ? Math.min(n, len) : len,
                arr = this.slice(0),
                temp,
                index;
        for( var i = 0; i < len; i++ ) {
            //返回一个随机值
            index = range(i, len - 1);
            //储存当前的值
            temp = arr[i];
            //把随机的值和当前的值替换
            arr[i] = arr[index];
            //把当前的值替换成缓存的值
            arr[index] = temp;
        }
        //返回一个新数组而不是副本
        return arr.slice(0, num);
};

 

4.underscore.js 中的 shuffle 方法

function random(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
};
function shuffle(arr) {
  var length = arr.length,
      shuffled = Array(length);
  for (var index = 0, rand; index < length; index++) {
      rand = random(0, index);
      if (rand !== index) shuffled[index] = shuffled[rand];
      shuffled[rand] = arr[index];
    }
    return shuffled;
}

  

这篇文章主要总结和收集了有关于数组随机排序一些算法 :)

posted @ 2016-03-19 13:39  小菜鸡12315  阅读(388)  评论(0编辑  收藏  举报