上篇文章介绍了一下基本的冒泡排序,今天介绍一下快速排序。
function QuickSort($_array) { if (count($_array)<=1) { return $_array; } $key = $_array[0]; $left_array = $right_array = array(); for ($i=1;$i<count($_array);$i++) { if ($_array[$i] > $key) { $right_array[] = $_array[$i]; } else { $left_array[] = $_array[$i]; } } $left_array = QuickSort($left_array); $right_array = QuickSort($right_array); return array_merge($left_array,array($key),$right_array); } /* * 生成随机数组 */ function rand_array($_num) { for($i=0;$i<$_num;$i++) { $array[$i] = rand(0,$_num*10); } return $array; } $rand_array = rand_array(10000); $start = time(); $result = QuickSort($rand_array); $end = time(); print_r($result); echo "快速排序需要的时间" . ($end - $start) . "秒;"; ?>
冒泡排序需要好几十秒的时间,但是快速排序只需要1秒钟的时间。
性能分析
快速排序快速排序快速排序快速排序:它同样是冒泡排序的改进,它通过一次交换能消除多个逆序,这样可以减少逆序时所消耗的扫描和数据交换次数。在最优情况下,它的排序时间复杂度为O(nlog2n)。 即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(n^2)。即每次划分子串时,一串为空,另一串为m-1(程序中的100K正 序和逆序就正是这样,如果程序中采用每次取序列中部数据作为划分点,那将在正序和逆时达到最优)。从100K中正序的结果上看“快速排序”会比“冒泡排 序”更慢,这主要是“冒泡排序”中采用了提前结束排序的方法。有的书上这解释“快速排序”,在理论上讲,如果每次能均匀划分序列,它将是最快的排序算法, 因此称它作快速排序。虽然很难均匀划分序列,但就平均性能而言,它仍是基于关键字比较的内部排序算法中速度最快者。
参考:http://blog.csdn.net/v_JULY_v/article/details/6211155