快速排序的php实现

  再来一个非常高级的排序算法,快速排序...这个算法是很高效的。

快速排序的思路是,找到一个分割点,把原数组分隔成两部分,在分割点左侧的是都比它小的,在它右侧的是都比它大的。然后分别把这两部分再递归调用排序,自然就全部排序完成。

当然最重要的步骤就是切分,然后进行递归调用,重复以上分割操作,直到break。代码示例如下,

 

<?php


// 寻找分割点,并交换值
function slicearr(&$arr, $low, $high){

    $i = $low;
    $j = $high + 1;
    $choosen = $arr[$low];
    while(1){
        while($arr[++$i] < $choosen){// 从左边要找大的,把大的交换到右边去
            if ($i >= $high) break;
        }

        while($arr[--$j] > $choosen){// 从右边要找小的,交换到左边去
            if ($j <= $low) break;     
        }
        
        if ($i >= $j) break;// 从左往右找,或者从右往左找,注意不能交叉...否则退出循环

        $temp = $arr[$i];
        $arr[$i] = $arr[$j];
        $arr[$j] = $temp;

        // echo '<br/>',$low,' ',$high, '<br/>';
    }
    
    $temp = $arr[$low];
    $arr[$low] = $arr[$j];
    $arr[$j] = $temp;

    return $j;// 返回分割点

}


// 递归快速排序
function qsort(&$arr, $low, $high){
    if ($low >= $high) return;
    $i = slicearr($arr, $low, $high);// 该步骤的分割点
    qsort($arr, $low, $i-1);// 递归调用
    qsort($arr, $i+1, $high);
}



$arr = array(12, 17, 13, 16, 19, 11, 4, 5, 9, 77, 18);

shuffle($arr);

echo '<pre>'; print_r($arr);

qsort($arr, 0, count($arr)-1);// 排序

echo '<pre>'; print_r($arr);

 

理解快速排序怎么交换值这点尤为关键,这个算法感觉很机智。。加深理解算法中的智慧吧~

 

你可能感兴趣的:(快速排序的php实现)