精通独立游戏,血型,动漫,指弹吉他,篮球,涂鸦,人体音箱,魔术,塔罗牌,那该多好啊。
主页:www.rainssong.com
微博:www.weibo.com/rainssong
知乎:www.zhihu.com/people/rainssong
流氓百科:www.roguewiki.net

© 下雨的声音 | Powered by LOFTER

sort() 函数原理

标题:sort() 函数原理 

分类: as3

日期: 2012-09-22 19:11

原文地址: https://blog.sina.com.cn/s/blog_59fc399801016d67.html


Array的sort函数可以对数组进行排序。他究竟是怎么工作的呢?


我们利用自定义比较函数对其进行测试,看看能不能发现什么。


使用 比较函数的原理 (摘自Adobe说明): 

此方法使用语法和参数顺序 Array.sort(compareFunction, sortOptions),其参数定义如下:

compareFunction - 一个用来确定数组元素排序顺序的比较函数。此参数是可选的。比较函数应该用两个参数进行比较。给定元素 A 和 B,compareFunction 的结果可以具有负值、0 或正值:

若返回值为负,则表示 A 在排序后的序列中出现在 B 之前。

若返回值为 0,则表示 A 和 B 具有相同的排序顺序。

若返回值为正,则表示 A 在排序后的序列中出现在 B 之后。 


请注意,这里有一个 错误 ,正确说法应该是

若返回值<=-1,则表示 A 在排序后的序列中出现在 B 之前。 

若返回值>-1 && <1,则表示 A 和 B 具有相同的排序顺序。 

若返回值>=1,则表示 A 在排序后的序列中出现在 B 之后。 


原因我猜想可能是 compareFunction 的返回值会被取整吧。


实验: 

新建一个函数来做测试。让每次都返回1,于是A就肯定会去B后面

private function sortTrace(arr:Array):Array

{

var outputArr:Array = arr.slice();

outputArr.sort

(

function(a:*,b:*):Number

{


trace(a, b);

return 1;

}

);

trace("currentArr",outputArr);

return outputArr;

}


然后


sortTrace([1,2,3,4,5]) 


输出的是://后为猜想的数组结果

2 3 //13245

5 3

4 3

1 3 //31245

2 3 //这里重复比较了,估计adobe的工程师加班了?

1 4 //34215

5 4

2 4

1 4

1 2

1 5 //34251

2 5 //34521


currentArr 3,4,5,2,1


结论: 

根据输出猜测是快速排序法


注意: 

不要用sort来进行随机排序,因为快速排序法是一种不稳定的排序法!因此无法保证每个数获得相同的待遇,会导致每种结果出现的概率不尽相同。 


 
评论
热度(1)
 
回到顶部