随机排列是个很常用的算法,比如洗牌。算法思想很简单,比如有一副整理好的牌,每次随机抽取一张最后就组成一副随机的牌了,并且可以证明所有可能性的排列是等概率的。但是该算法的空间复杂度是O(n),如果每次抽牌都插入到头部,则最坏情况下的时间复杂度是O(n*n)。参考Introduction to Algorithm 5.3的算法,其实对第二种方法稍作改进就可以达到O(n)。算法如下:
- 保持头部的以抽取队列,以及尾部的为抽取队列,一开始头为空,尾为满。
- 从尾部随机抽牌,与尾部第一张交换,头部加一,尾部减一
- 直到尾部为空
以下是javascript代码
var array = [1,2,3,4];for(var i=0,len=array.length;i<len-1;i++){ var pos = i + Math.floor((len - i)*Math.random()); var tmp = array[pos]; array[pos] = array[i]; array[i] = tmp;}alert(array.join(', '));
来源:https://www.cnblogs.com/dragonpig/archive/2011/01/16/1936512.html