自己重写了一下快速排序的算法

今天上网看快速排序,发现这么一个经典的算法网上贴出的代码要不有BUG,要不就是运算的步骤还是冗余了,所以自己重新写了个,看了下结果应该是减少大部分不需要的步骤。

希望各位路过的道友帮忙验证下有没有BUG

先贴下运算结果:

//startK 开始键值    endK结束键值   DG:递归深度


函数代码:

 public function qsort(&$arr = array(),$startKey = 0,$endKey = 0,$DG = 1){
    	
    	
    	if ($endKey == 0){
    		$endKey = count($arr) - 1;
    	}
    	
    	$sk = $startKey;
    	$ek = $endKey;
    	
    	$excK = $startKey;
    	$excV = $arr[$startKey];


    	$llock = true;
    	$rlock = false;

    	while (($ek != $excK || !$llock) && ($sk != $excK || !$rlock)){
    		if ($excV > $arr[$ek] && ($ek > $excK)){
    			list($arr[$excK],$arr[$ek]) = array($arr[$ek],$arr[$excK]);
    			$excK= $ek;
    			$rlock = true;
    			$llock = false;
    		}elseif (!$rlock) {
    			$ek--;
    		}
    		
    		
    		if ($ek <= $sk){
    			break;
    		}
    		
    		if ($excV < $arr[$sk] && ($sk < $excK)){
    			list($arr[$sk],$arr[$excK]) = array($arr[$excK],$arr[$sk]);
    			$excK= $sk;
    			$rlock = false;
    			$llock = true;
    		}elseif (!$llock) {
    			$sk++;
    		}
    		
    	}
    	
    	if ($excK- $startKey > 1){
    		$this->qsort($arr,$startKey,$excK-1,$DG+1);
    	}
    	if ($endKey - $excK > 1){
    		$this->qsort($arr,$excK+1,$endKey,$DG+1);
    	}
    	return ;
    	
    }
思路:在一个无序的数列中,

1、选取第一个数作为基准数 $excK => $excV,从数列最后 $ek往前筛选,当 $arr[$ek]比$excV小时,两者互换位置,$exck = $ek ;

2、改由数列的最前端sk向后筛选,当$arr[sk]比excV大时,两者互换位置,$exck = $sk; 

3、继续换回到从$ek往前筛选

直到$ek <= $sk ,在 $excK的位置拆分数组,进入递归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值