- 快排平均效率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=high 12 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 )