快排的思想:找一个基准数,大于基准数的放右边,小于基准数的放左边,然后将基准数左右看成两个子数组,分别再重复以上过程。
说起来简单,但是怎么才能把大于基准数的放右边,小于基准数的放左边并不太容易。
而且有个坑是:如果选取第一个元素为基准数,则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);
}