php实现快速排序

快排的思想:找一个基准数,大于基准数的放右边,小于基准数的放左边,然后将基准数左右看成两个子数组,分别再重复以上过程。
说起来简单,但是怎么才能把大于基准数的放右边,小于基准数的放左边并不太容易。
而且有个坑是:如果选取第一个元素为基准数,则j--在i++之前,如本例子;如果选取的基准数是最后一个元素,则i++在j--之前,读者可以尝试一下,否则是有问题的。

<?php
$arr = [4,7,2,6,5,3,1];

function quickSort(array $arr){
    if(count($arr) == 1){
        return $arr;
    }
    $i = 0;
    $j = count($arr)-1;    
    $baseIndex = 0;
    for(;$i < $j;){
        while($arr[$j] > $arr[$baseIndex] && $i < $j){
            $j--;
        }
        while($arr[$i] <= $arr[$baseIndex] && $i < $j){
            $i++;
        }
        $temp    = $arr[$i];
        $arr[$i] = $arr[$j];
        $arr[$j] = $temp;


    }
    $temp = $arr[$i];
    $arr[$i] = $arr[$baseIndex];
    $arr[$baseIndex] = $temp;
    $arr1 = quickSort(array_slice($arr, 0, $i+1));
    $arr2 = quickSort(array_slice($arr, $i+1));
    return array_merge($arr1, $arr2);

}
$res = quickSort($arr);
foreach ($res as $key => $value) {
    var_dump($value);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容