加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

AS3 - 数组元素乱序方法以及效率比较

发布时间:2020-12-15 19:50:28 所属栏目:百科 来源:网络整理
导读:flash,flex开发中,有时我们会用到随机排序,就是把一个数组随机打乱,即洗牌方法。 随机排序可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种: 1.自身插入法 private function randomArr (arr:Array) :Array { va

flash,flex开发中,有时我们会用到随机排序,就是把一个数组随机打乱,即洗牌方法。
随机排序可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种:

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)
    {
        indexA = 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自己交换),就可以得到一个随机数组。

效率比较:
利用1-100的顺序数组进行测试,执行10000次所用的时间分别为。
自身插入法:1654
传统插入法(放进新数组): 2574
选择法:594

原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_453.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读