• PHP 合并排序


    • 合并排序是稳定排序,平均效率为O(nlogn),需要的辅助空间是O(n)
     1 <?php
     2     #归并排序
     3     #@param    $arr    待排序数组
     4     #@param    $from    排序的起始坐标
     5     #@param    $end    排序的结束坐标
     6     function mergeSort(&$arr, $from, $end) {
     7         #切分数组直到数组元素只剩下一个
     8         if($from < $end) {
     9             $mid = floor(($from + $end) / 2);
    10             mergeSort($arr, $from, $mid);
    11             mergeSort($arr, $mid +1, $end);
    12             
    13             #合并数组
    14             $tempArr = array();
    15             $leftInx = $from;
    16             $rightInx = $mid + 1;
    17             
    18             #合并左右两部,直到左边或右边部分全部排入临时数组
    19             while($leftInx <= $mid && $rightInx <= $end) {
    20                 if($arr[$leftInx] < $arr[$rightInx]) {
    21                     $tempArr[] = $arr[$leftInx++];
    22                 } else {
    23                     $tempArr[] = $arr[$rightInx++];
    24                 }
    25             }
    26             
    27             #处理没有排完的一部分的剩下元素,因为待合并的部分是有序数组,剩下的元素直接全部加入临时数组
    28             while($leftInx <= $mid) {
    29                 $tempArr[] = $arr[$leftInx++];
    30             }
    31             
    32             while($rightInx <= $end) {
    33                 $tempArr[] = $arr[$rightInx++];
    34             }
    35             
    36             #用临时数组的值替换掉原数组的值
    37             array_splice($arr, $from, $end - $from + 1, $tempArr);
    38         }
    39     }
    40     
    41     $arr = array(1, 1, 5, 7, 2, 4, 3, 6, 3, 0);
    42     mergeSort($arr, 0, count($arr) - 1);
    43     print_r($arr);
    44 ?>

    输出

    Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 2 [4] => 3 [5] => 3 [6] => 4 [7] => 5 [8] => 6 [9] => 7 )

  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/zemliu/p/2648399.html
Copyright © 2020-2023  润新知