2016-10-13 00:16:48 点击量:8 标签: 收藏本文
把一个数组随机打乱,可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种。(感谢9ria论坛的朋友提供思路)
1.自身插入法
- //
- private function randomArr(arr:Array):Array
- {
- var outputArr:Array = arr.slice();
- var i:int = outputArr.length;
- while (i)
- {
- outputArr.push(outputArr.splice(int(Math.random() * i--), 1)[0]);
- }
- return outputArr;
- }
通常插入法是将随机移出来的数扔到新的数组里,但是这么写的牛逼之处在于扔自己数组后面了,节省了效率:)。此法在数组较短时效率高,超过200效率就不如传统插入法了。
2.传统插入法
- private function randomArr(arr:Array):Array
- {
- var cloneArr:Array = arr.slice();
- var outputArr:Array = [];
- var i:int = cloneArr.length;
- while (i)
- {
- outputArr.push(cloneArr.splice(int(Math.random() * i--), 1)[0]);
- }
- return outputArr;
- }
在数组较长(200以上)时效率比自身插入法高,因为短数组操作起来更快。
3.选择法
- private function randomArr(arr:Array):Array
- {
- var outputArr:Array = arr.slice();
- var i:int = outputArr.length;
- var temp:*;
- var indexA:int;
- var indexB:int;
- while (i)
- {
- iindexA = i-1;
- indexB = Math.floor(Math.random() * i);
- i--;
- if (indexA == indexB) continue;
- temp = outputArr[indexA];
- outputArr[indexA] = outputArr[indexB];
- outputArr[indexB] = temp;
- }
- return outputArr;
- }
选择排序法就是按照顺序从余下数中选出最小(大)的数,和顺序位置的数字交换,反复进行。此法最多可能会交换n-1次,比如[4,1,2,3]递增排序中 的4就需要挪3次,当然最少一次也不用。但是随机算法循环次数无法浮动,必须是固定的,怎么办呢?没有关系,我们可以引入废操作,位置已经摆对的数自己和 自己交换,这样就可以让所有顺序排序都成为n-1步走。
反过来想就明白了,从0开始每个位置和后面的随机位置交换,也可以和自己交换,直到n-2和n-1(或n-2自己交换),就可以得到一个随机数组。
(说得轻松,我可是抓破头皮- -b)
我们是一家提供综合软件外包与弱电工程服务的技术公司。
业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。
公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室