AS3 随机排序效率比较

算法列表:
1.自身插入法
  1. private function randomArr(arr:Array):Array
  2.                 {
  3.                         var outputArr:Array = arr.slice();
  4.                         var i:int = outputArr.length;
  5.                         
  6.                         while (i)
  7.                         {
  8.                                 outputArr.push(outputArr.splice(int(Math.random() * i--), 1));
  9.                         }
  10.                         
  11.                         return outputArr;
  12.                 }
复制代码
通常插入法是将随机移出来的数扔到新的数组里,但是这么写的牛逼之处在于扔自己数组后面了,大大节省了效率:);


2.选择法(已经修正)

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



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


3.利用Sort() (具体原理不明)

  1. private function randomArr5(arr:Array):Array
  2.                 {
  3.                         var outputArr:Array = arr.slice();
  4.                         outputArr.sort(function():int{return Math.random()>.5?1:-1}); 
  5.                         return outputArr;
  6.                 }
复制代码
sort可以带一个比较函数, 排序时,会自动匹配所有两个 参数 进行比较,

当返回值为1时,参数A对应元素排到参数B对应元素后

当返回值为0时,参数A与参数B位置保持不变

当返回值为-1时,参数B对应元素排到参数A对应元素前




效率比较:

利用1-100的顺序数组进行测试,执行10000次所用的时间分别为。
自身插入法:1654
普通插入法(放进新数组): 2574 
选择法: 499  594
利用Sort() :1479
选择法>Sort() >自身插入法  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值