19.被广泛误用的JavaScript数组乱序实现

偶尔在一篇博文中看到一个数组的乱序实现(百度了一下,这种做法很广泛):

function shuffle(arr) {
   arr.sort(function () {
      return Math.random() - 0.5;
   });
}

乍一看好像没什么问题,但仔细一想,乱序算法依赖sort算法的实现,假如sort的算法采用的冒泡排序这类的稳定排序,那数组的第一个元素要排到最后一位,概率岂不是(1/2)^n?

很显然这种乱序排序的做法是不可取的,而大部分人之所以感觉乱序结果随机,只不过浏览器刚好采用了“合适”的sort算法罢了,但是这种错误的做法仍然不能忍受,因为它不具有移植性。JavaScript用的没问题,你能确保Java,C#,PHP等都可以这样用吗?显然,这很误导人不是?

19.1 乱序实现

实现数组的乱序排序不难,所以这里不会去讲解如何实现,简单贴两个StackOverflow里面讨论的实现。这个博文的主要目的就是纠正这种错误和误导人的实现。

有兴趣的人可以去看下StackOverflow里面的讨论:http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array/6274381#6274381

function shuffle(a) {
    var j, x, i;
    for (i = a.length; i; i--) {
        j = Math.floor(Math.random() * i);
        x = a[i - 1];
        a[i - 1] = a[j];
        a[j] = x;
    }
}
function shuffle(a) {
    for (let i = a.length; i; i--) {
        let j = Math.floor(Math.random() * i);
        [a[i - 1], a[j]] = [a[j], a[i - 1]];
    }
}

你可能感兴趣的:(19.被广泛误用的JavaScript数组乱序实现)