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

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

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

先贴下运算结果:

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

自己重写了一下快速排序的算法_第1张图片

函数代码:

 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的位置拆分数组,进入递归。

你可能感兴趣的:(自己重写了一下快速排序的算法)