今天上网看快速排序,发现这么一个经典的算法网上贴出的代码要不有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的位置拆分数组,进入递归。