美文网首页
PHP归并排序求最小和

PHP归并排序求最小和

作者: 程序小白菜 | 来源:发表于2019-06-12 12:06 被阅读0次
/**
 *
 * 归并求数组的最小和
 *
 * @param array $arr
 * @return array
 */
function minSumByMergeSort(array &$arr) {
      $len = count($arr);
      if (!$len || empty($arr)) {
            return 0;
      }

      mergeSort($arr, 0, $len-1);
}

/**
 *
 * 把数组arr[L...R]调整有序
 *
 * @param array $arr
 * @param $left
 * @param $right
 * @return array|float|int
 */
function mergeSort(array &$arr, $left, $right) {
      if (intval($left) === intval($right)) {
          return 0;
      } 

      $middle = $left + (($right - $left) >> 1);

      return mergeSort($arr, $left, $middle)
          + mergeSort($arr, $middle+1, $right)
          + mergeArray($arr, $left, $middle, $right);
}

/**
 *
 * 把两个有序的数组合并成一个有序的数组,并求出最小和
 *
 * @param array $arr
 * @param $left
 * @param $middle
 * @param $right
 * @return float|int
 */
function mergeArray(array &$arr, $left, $middle, $right) {
      $helpArr = [];
      $i = 0;
      $sum = 0;

       //定义左侧和右侧有序数组的起始索引
      $leftIndex = $left;
      $rightIndex = $middle+1;
      
      //左右两侧都不越界
      while (($leftIndex <= $middle) && ($rightIndex <= $right)) {
          $sum += $arr[$leftIndex] < $arr[$rightIndex] ? ($right - $rightIndex + 1) * $arr[$leftIndex] : 0;
          $helpArr[$i++] = $arr[$leftIndex] < $arr[$rightIndex] ? $arr[$leftIndex++] : $arr[$rightIndex++];
      }

      //若左右一定有一个越界,另一个不越界
      while ($leftIndex <= $middle) {
          $helpArr[$i++] = $arr[$leftIndex++];
      }

      while ($rightIndex <= $right) {
          $helpArr[$i++] = $arr[$rightIndex++];
      }

      $helpLen = count($helpArr);

      for ($i = 0; $i < $helpLen; $i++) {
          $arr[$left+$i] = $helpArr[$i];
      }

      return $sum;
}


相关文章

  • PHP归并排序求最小和

  • 排序算法

    递归找到最小值排序 2.选择排序 归并排序 4.计数排序(哈希表)

  • 排序

    1.归并排序 归并排序概念归并排序核心思想是分治,即将完整数组拆分成更小的数组,最小单位位1,每个小的数组排好序,...

  • 归并排序

    归并排序 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。 将数组分解最小...

  • 排序与搜索: 归并排序

    归并排序 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。 将数组分解最小...

  • 排序算法

    常考排序 快速排序 归并排序 归并排序求逆序数对 堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法。 堆积...

  • 5.归并排序

    5.归并排序 5.1归并排序的思想和复杂度 归并排序思想 归并排序主要是分治法的思想,有自顶向下和自底向上的归并排...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 排序算法

    冒泡 选择排序 从队列中挨个选出最小的,放在最前面 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排...

网友评论

      本文标题:PHP归并排序求最小和

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