随机排列算法

╄→гoц情女王★ 提交于 2020-03-26 04:40:50

随机排列是个很常用的算法,比如洗牌。算法思想很简单,比如有一副整理好的牌,每次随机抽取一张最后就组成一副随机的牌了,并且可以证明所有可能性的排列是等概率的。但是该算法的空间复杂度是O(n),如果每次抽牌都插入到头部,则最坏情况下的时间复杂度是O(n*n)。参考Introduction to Algorithm 5.3的算法,其实对第二种方法稍作改进就可以达到O(n)。算法如下:

  1. 保持头部的以抽取队列,以及尾部的为抽取队列,一开始头为空,尾为满。
  2. 从尾部随机抽牌,与尾部第一张交换,头部加一,尾部减一
  3. 直到尾部为空

以下是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(', '));

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!