从别人博客上找到一篇关于as3快速排序的代码,使用后发现在有大量相同数据的情况下,排序不可靠,容易出现堆栈溢出的现象,
记起看过一个C的二叉树排序法,现改成AS3版本并加以注释。
全部代码如下
private function mysort(array:Vector.<int>,left:int,right:int):void{
var tl:int = left;var tr:int = right;
var center:int = array[tl];
while(tl<tr){
while(array[tl] < center) tl++;
while(array[tr] > center) tr--;
if(tl>=tr)break;
var temp:int = array[tl];
array[tl] = array[tr];
array[tr] = temp;
if(array[tl] == center)tr--;
if(array[tr] == center)tl++;
}
f(tl == tr){
tl++;tr--;
}
if(tl < right)mysort(array,tl,right);
if(tr > left)mysort(array,left,tr);
}
首先定义一个本轮的左游标和右游标 tl tr
然后随机取一个成员作为中间值
var center:int = array[tl];
你可以选取任何一个成员 当然也可以选择中间的成员 这个中间值与每个成员无关 但必须等于其中一个成员
array[int((tl+tr)/2)];
先左游标开始向右查找大于等于中间值的成员,没找到则移动游标直到找到为止。同理 右游标向左查找小于中间值的成员
while(array[tl] < center) tl++;
while(array[tr] > center) tr--;
由于我们选取的中间值是待排序数组的一个成员,所以即便数据排列已经是期望结果,我们依然能够拿到一组指向中间值的数据。
当左右游标都找到目标后,进行交换,假如左右游标指向的数据正好等于中间值,则将游标移动到下一位,但是我们已经交换过数据,此时的左游标指向的其实是交换前右游标指向的数据。
if(array[tl] == center)tr--;
if(array[tr] == center)tl++;
当数据按我们的要求排列好后,由于左游标要大于右游标,而它们中间的必定即大于等于中间值也小于等于中间值,即等于中间值。不必再参与排序。
所以此时左游标之后的数据都是大于等于中间值的,而右游标之前的数据都是小于等于中间值。我们将它们继续递归,最后得到结果。