AS3二叉树排序法排序


从别人博客上找到一篇关于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++;


当数据按我们的要求排列好后,由于左游标要大于右游标,而它们中间的必定即大于等于中间值也小于等于中间值,即等于中间值。不必再参与排序。

所以此时左游标之后的数据都是大于等于中间值的,而右游标之前的数据都是小于等于中间值。我们将它们继续递归,最后得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值