快速排序
思路:
- 我們首先要找到一個基準,數組的前半部分是比基準小的元素,數組後半部分是比基準大的元素,這裏我就拿數組第一個元素作爲基準;
- 設置隊首和隊尾兩個指針;
- 隊尾指針先進行活動,一直向隊首移動,直到找到比基準值小的元素,然後將這個值賦給隊首指針處;
- 下面隊首指針開始活動,一直向隊尾移動,直到找到比基準值大的元素,然後將這值賦給隊尾指針處;
- 等到隊首指針和隊尾指針指向同一處時,將基準值賦給當前指針指向的同一位置,此時,基準元素前面的都是比它要小的元素,後面都是比它大的元素;
- 接下來,就是採用上述步驟將兩邊的部分分別進行排序,如此循環下去,直至開始的low>=開始的high,說明就剩下了一個元素,也就無需再排了。
/**
* @param $arr
* @param $low
* @param $high
* @return mixed
*/
function quickSort(&$arr,$low,$high){
if($low < $high){
$index = getIndex($arr,$low,$high);
quickSort($arr,0,$index-1);
quickSort($arr,$index+1,$high);
}
return $arr;
}
/**
* @param $arr
* @param $low
* @param $high
* @return mixed
*/
function getIndex(&$arr,$low,$high){
$tmp = $arr[$low];
while($low < $high){
//如果隊尾元素值大於基準元素,那麼high--
while($low < $high && $arr[$high] > $tmp){
$high--;
}
//如果隊尾元素小於基準值,那麼就將隊尾元素賦值給隊首元素
$arr[$low] = $arr[$high];
//如果隊首元素小於基準值,那麼low++
while($low < $high && $arr[$low] < $tmp){
$low++;
}
//如果隊首元素大於基準值,就將隊首元素賦值給隊尾元素
$arr[$high] = $arr[$low];
}
//退出時,high == low
$arr[$low] = $tmp;
return $low;
}
$arr = array(4,5,1,6,2,8,3,11,10);
print_r(quickSort($arr,0,count($arr)-1));