zoukankan      html  css  js  c++  java
  • PHP 快速排序

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

  • 相关阅读:
    bzoj3757 苹果树
    bzoj2743 [HEOI2012]采花
    bzoj4241 历史研究
    bzoj4448 [Scoi2015]情报传递
    bzoj3295 [Cqoi2011]动态逆序对
    bzoj4034 [HAOI2015]T2
    bzoj3339 Rmq Problem
    BZOJ 1017 魔兽地图
    BZOJ 1021 循环的债务
    SUOI #37 清点更多船只
  • 原文地址:https://www.cnblogs.com/zemliu/p/2646389.html
Copyright © 2011-2022 走看看