快速排序思路: 将第一个数字作为基准数字,从最右端开始查找(要从右边开始查起哦,因为基准数是最左位的).找出小于它的数字,然后再从左端对比.找大于它的数字.然后将俩个数字进行互换.
就这样一直互换.直到最左与最右走到同一个位置上时,再将这个位置的数字与基准数做对比和互换.这样就形成了基准数的左边全是小于的,右边都是大于的.
然后再将左边的数据,按照上面的流程进行互换.然后右边的数据, 最后再进行组合
$arr = array(6, 1 ,2 , 7, 9, 3, 4, 5,10 ,8);
//$arr = array(6,43,45,33,60,50,40);
function quickSort($arr) {
if(count($arr) <= 1){
return $arr;
}
//拿第一个数字做中间值
$centre = $arr[0];
$l = 1;
$r = count($arr)-1;
while($l < $r && $l != $r ) {
#从右边向左边移动,对比.如果遇到比中间值小的就跳出
while($arr[$r] > $centre && $l < $r) {
$r--;
}
#从左边向右边移动,对比.如果遇到比中间值大的就跳出
while($arr[$l] < $centre && $l < $r) {
$l++;
}
#如果左边遇到了比中间值大的数字 并且 右边遇到了比中间值小的数 则进行互换
if($l < $r ) {
$t = $arr[$l];
$arr[$l] = $arr[$r];
$arr[$r] = $t;
}
}
#将左右俩边最终走到一起的值与中间值做对比,并互换位置
if($arr[$l] < $centre) {
$tmp1 = $arr[$l];
$arr[$l] = $centre;
$arr[0] = $tmp1;
} else{
$l--;
}
$left_arr = quickSort(array_slice($arr, 0 , $l));
$right_arr = quickSort(array_slice($arr, $l+1));
return array_merge($left_arr, array($arr[$l]), $right_arr);
}
var_dump(quickSort($arr));