快速排序思路: 將第一個數字作爲基準數字,從最右端開始查找(要從右邊開始查起哦,因爲基準數是最左位的).找出小於它的數字,然後再從左端對比.找大於它的數字.然後將倆個數字進行互換.
就這樣一直互換.直到最左與最右走到同一個位置上時,再將這個位置的數字與基準數做對比和互換.這樣就形成了基準數的左邊全是小於的,右邊都是大於的.
然後再將左邊的數據,按照上面的流程進行互換.然後右邊的數據, 最後再進行組合
$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));