• 快排平均效率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 )

posted on 2012-08-19 14:36  ZimZz  阅读(1950)  评论(0编辑  收藏  举报