- 快排平均效率O(nlogn),最好情況O(nlogn),最壞情況是當數組有序時,退化成O(n^2)
1 <?php 2 #快速排序 3 #@param $arr 待排序數組 4 #@param $start 排序的開始座標 5 #@param $end 排序數組的結束座標 6 function quickSort(Array &$arr, $start, $end) { 7 $low = $start; 8 $high = $end; 9 10 #同時移動low和high,low找比$arr[$start]大的元素,high找比$arr[$start]小的元素11 #交換大小元素位置,知道low=high12 while($low != $high) {13 while($arr[$low] <= $arr[$start] && $low != $high) {14 ++$low;15 }16 while($arr[$high] >= $arr[$start] && $low != $high) {17 --$high;18 }19 $temp = $arr[$low];20 $arr[$low] = $arr[$high];21 $arr[$high] = $temp;22 }23 24 #如果low和high指向的元素小於$arr[$start],交換$arr[$start]和這個元素25 #否則交換$arr[$start]和low指向的前一個元素,然後進入遞迴26 if($low != $start && $arr[$low] > $arr[$start]) $low--;27 $temp = $arr[$low];28 $arr[$low] = $arr[$start];29 $arr[$start] = $temp;30 31 #遞迴中止條件是切分後的部分只剩下一個元素32 if($low - 1 > $start) quickSort($arr, $start, $low - 1);33 if($low + 1 < $end) quickSort($arr, $low + 1, $end);34 }35 36 $arr = array(8, 8, 1, 1, 5, 3, 7, 9, 8, 4, 10);37 quickSort($arr, 0, count($arr) - 1);38 39 print_r($arr);40 ?>
輸出
Array ( [0] => 1 [1] => 1 [2] => 3 [3] => 4 [4] => 5 [5] => 7 [6] => 8 [7] => 8 [8] => 8 [9] => 9 [10] => 10 )