·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]AS3.0随机排序高效的算法介绍三种算法

时间:2014-04-01 23:009ria.com
把一个数组随机打乱,可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种

把一个数组随机打乱,可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种。(感谢9ria论坛的朋友提供思路)

1.自身插入法

  1. //
  2. private function randomArr(arr:Array):Array 
  3. var outputArr:Array = arr.slice(); 
  4. var i:int = outputArr.length; 
  5. while (i) 
  6. outputArr.push(outputArr.splice(int(Math.random() * i--), 1)[0]); 
  7. return outputArr; 

通常插入法是将随机移出来的数扔到新的数组里,但是这么写的牛逼之处在于扔自己数组后面了,节省了效率:)。此法在数组较短时效率高,超过200效率就不如传统插入法了。

2.传统插入法

  1.  
  2. private function randomArr(arr:Array):Array 
  3. var cloneArr:Array = arr.slice(); 
  4. var outputArr:Array = []; 
  5. var i:int = cloneArr.length; 
  6. while (i) 
  7. outputArr.push(cloneArr.splice(int(Math.random() * i--), 1)[0]); 
  8. return outputArr; 

在数组较长(200以上)时效率比自身插入法高,因为短数组操作起来更快。

3.选择法

  1. private function randomArr(arr:Array):Array 
  2.         var outputArr:Array = arr.slice(); 
  3.         var i:int = outputArr.length; 
  4.         var temp:*; 
  5.         var indexA:int; 
  6.         var indexB:int; 
  7.                                                  
  8.         while (i) 
  9.         { 
  10.                 iindexA = i-1; 
  11.                 indexB = Math.floor(Math.random() * i); 
  12.                 i--; 
  13.                                  
  14.                 if (indexA == indexB) continue; 
  15.                 temp = outputArr[indexA]; 
  16.                 outputArr[indexA] = outputArr[indexB]; 
  17.                 outputArr[indexB] = temp; 
  18.         } 
  19.                          
  20.         return outputArr; 

选择排序法就是按照顺序从余下数中选出最小(大)的数,和顺序位置的数字交换,反复进行。此法最多可能会交换n-1次,比如[4,1,2,3]递增排序中 的4就需要挪3次,当然最少一次也不用。但是随机算法循环次数无法浮动,必须是固定的,怎么办呢?没有关系,我们可以引入废操作,位置已经摆对的数自己和 自己交换,这样就可以让所有顺序排序都成为n-1步走。
反过来想就明白了,从0开始每个位置和后面的随机位置交换,也可以和自己交换,直到n-2和n-1(或n-2自己交换),就可以得到一个随机数组。
(说得轻松,我可是抓破头皮- -b)

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器