php快速排序三種方法

WBOY
發布: 2016-07-25 08:53:52
原創
1046 人瀏覽過
  1. function quick_sort($array) {
  2. if(count($array) <= 1) return $array;
  3. $key = $array[0];
  4. $rightArray = array();
  5. $leftArray = array();
  6. for($i = 1; $i < count($array); $i ) {
  7. if($array[$i] >= $key) {
  8. $rightArray[] = $array[$i];
  9. } else {
  10. $leftArray[] = $array[$i];
  11. }
  12. }
  13. $leftArray = quick_sort($leftArray);
  14. $rightArray = quick_sort($rightArray);
  15. return array_merge($leftArray, array($key), $rightArray);
  16. }
复制代码

方法二:该算法来自算法导论,叫作Nico Lomuto方法(感兴趣goole上有详细说明)使用最经典的单方向一次遍历找到中值。 但这种算法在最坏情况下(例如值相同的数组,需要n-1次划分,每一次划分需要O(n) 时间去掉一个元素)最坏情况下为O(n*n)。 代码:

  1. function quick_sort(&$array, $start, $end) {
  2. if ($start >= $end) return;
  3. $mid = $start;
  4. for ($i = $start 1; $i <= $end; $i ) {
  5. if ($array[$i] < $array[$mid]) {
  6. $mid ;
  7. $tmp = $array[$i];
  8. $array[$i] = $array[$mid];
  9. $array[$mid] = $tmp;
  10. }
  11. }
  12. $tmp = $array[$start];
  13. $array[$start] = $array[$mid];
  14. $array[$mid] = $tmp;
  15. quick_sort($array, $start, $mid - 1);
  16. quick_sort($array, $mid 1, $end);
  17. }
复制代码

方法三:该方法基本上是教科书式的常见写法,首先从左向右遍历小于中间元素的跳过,同时从右向左遍历遇到大的元素跳过,然后 如果没有交叉着交换两边值,继续循环,直到找到中间点。注意该方法在处理相同元素的时候,仍旧交换,这样在最坏情况下也有O(nlogn) 效率。但下面的函数中,如果将$array[$right] > $key 改成 $array[$right] >=$key 或将 $array[$left] < $key改成$array[$left] <= $key则最坏 情况不但会堕落为O(n*n).而且除了每次比较的消耗外,还会产生n次交互的额外开销。该题还有另外两个考点,针对死记硬背的同学: 1,中间的两个while可否互换。当然不能互换,因为对于快盘需要一个额外的空间保存初始的左值,这样左右互换的时候,先用右边覆盖已经保存 为中值的左值,否则会出现问题。见这句$array[$left] = $array[$right]; 2,$array[$right] = $key; 该语句含义可否省略。该句不能省略,大家可以考虑一个极端情况比如两个值的排序(5,2),逐步看下就明白了。 代码:

  1. function quick_sort_swap(&$array, $start, $end) {
  2. if($end <= $start) return;
  3. $key = $array[$start];
  4. $left = $start;
  5. $right = $end;
  6. while($left < $right) {
  7. while($left < $right && $array[$right] > $key)
  8. $right--;
  9. $array[$left] = $array[$right];
  10. while($left < $right && $array[$left] < $key)
  11. $left ;
  12. $array[$right] = $array[$left];
  13. }
  14. $array[$right] = $key;
  15. quick_sort_swap(&$array, $start, $right - 1);
  16. quick_sort_swap(&$array, $right 1, $end);
  17. }
复制代码

您可能感兴趣的文章:

  • php实用快速排序算法的实例代码
  • php关联数组排序、快速排序的实例分享
  • php实现快速排序(quick sort)的函数
  • php实现快速排序的函数
  • php冒泡排序与快速排序的例子


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板