美文网首页
PHP归并排序

PHP归并排序

作者: 程序小白菜 | 来源:发表于2019-06-12 10:45 被阅读0次
    
    /**
     *
     * 归并排序
     *
     * @param array $arr
     * @return array
     */
    function mergeSort(array &$arr) {
        $len = count($arr);
        if (!$len || empty($arr)) {
            return [];
        }  
        
        process($arr, 0, $len-1);
    }
    
    /**
     *
     * 把数组arr[L...R]上调整有序
     *
     * @param array $arr
     * @param $left
     * @param $right
     * @return array
     */
    function process(array &$arr, $left, $right) {
          if (intval($left) === intval($right)) {
              return $arr;
          }
    
          $middle = (int)($left + ($right-$left) / 2);
    
          process($arr, $left, $middle);
          process($arr, $middle+1, $right);
          mergeArray($arr, $left, $middle, $right);
    
    }
    
    /**
     *
     * 将两个有序的数组合并为有序的数组
     *
     * @param array $arr
     * @param $left
     * @param $middle
     * @param $right
     */
    function mergeArr(array &$arr, $left, $middle, $right) {
          $i = 0;
          $helpArr = [];
          
          $leftIndex = $left;
          $rightIndex = $middle +1;
    
          //若左右两个数组都不越界
          while(($leftIndex <= $middle) && ($rightIndex <= $right)) {
                $helpArr[$i++] = $arr[$leftIndex] <= $arr[$rightIndex] ? $arr[$leftIndex++] : $arr[$rightIndex++];
          }
    
          //左右两个数组,一定有一个越界,另一个不越界
          while($leftIndex <= $middle) {
                $helpArr[$i++] = $arr[$leftIndex++];
          }
    
          while($rightIndex <= $right) {
                $helpArr[$i++] =  $arr[$rightIndex++];
          }
    
          $len = count($helpArr);
    
          for ($i = 0; $i < $len; $i++) {
                $arr[$left + $i] = $help[$i];
          }
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:PHP归并排序

          本文链接:https://www.haomeiwen.com/subject/ltskfctx.html