• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP-归并排序Merge-Sort

php 搞代码 3年前 (2022-03-01) 26次浏览 已收录 0个评论

​归并排序 工夫复杂度属于 O(nlogn) 级别的,相比于 O(n^2) 级别的排序算法,在解决大的数据量时,它的劣势非常明显,上面通过原理图和代码演示介绍归并排序是如何实现 O(nlogn) 工夫复杂度级别的。

1.将数组中有序的两部归并成一个过程原理图

在学习 归并排序 之前,先学习一下应用长期空间将数组中有序的两个局部归并成一个有序局部的原理图

Tips:须要额定应用空间,最初将排好序的值赋值给原来的变量中。

合并代码如下:

<?php
function twoMergeSort($arr,$left,$mid,$right){
    $aIndex = $left==$mid ? -1 : $left;
    $bIndex = $mid==$right ? -1 : $mid;
    $crr = [];
    while (($aIndex >= $left && $aIndex < $mid) || ($bIndex >= $mid && $bIndex <= $right)){
        $aValue = $arr[$aIndex]??null;
        $bValue = $arr[$bIndex]??null;
        if(($aIndex < $left || $aIndex >= $mid) || ($bValue < $aValue && $bValue != null)){
            $crr[] = $bValue;
            $bIndex++;
        }else{
            $crr[] = $aValue;
            $aIndex++;
        }
    }
    for ($i = 0;$i < ($right - $left);$i++){
        $arr[$i+$left] = $crr[$i];
    }
    return $arr;
}
$arr = [1,4,7,10,15,8,11,13,19,24];
print_r(twoMergeSort($arr,0,5,9));
/**
Array
(
    [0] => 1
    [1] => 4
    [2] => 7
    [3] => 8
    [4] => 10
    [5] => 11
    [6] => 13
    [7] => 15
    [8] => 19
    [9] => 24
)
 */

2. 无序数组合成示意图

能够应用递归二分的思维把一个无序的数组合成为多个单元素的数组(单元素数组也能够看做有序数组)

Tips:能够采纳递归的思维实现归并排序。

3.归并排序代码

<?php
class MergeSort
{
    /**
     * 将数组两个有序局部合并成一个
     * @param $arr
     * @param $left
     * @param $mid
     * @param $right
     * @return mixed
     */
    private function twoMergeSort($arr,$left,$mid,$right){
        $aIndex = $left==$mid ? -1 : $left;
        $bIndex = $mid==$right ? -1 : $mid;
        $crr = [];
        while (($aIndex >= $left && $aIndex < $mid) || ($bIndex >= $mid && $bIndex <= $right)){
            $aValue = $arr[$aIndex]??null;
            $bValue = $arr[$bIndex]??null;
            if(($aIndex < $left || $aIndex >= $mid) || ($bValue < $aValue && $bValue != null)){
                $crr[] = $bValue;
                $bIndex++;
            }else{
                $crr[] = $aValue;
                $aIndex++;
            }
        }
        for ($i = 0;$i < ($right - $left);$i++){
            $arr[$i+$left] = $crr[$i];
        }
        return $arr;
    }
    public function arrayMergeSort($arr){
      $this->recursionMergeSort($arr,0,count($arr) - 1);
        return $arr;
    }
    private function recursionMergeSort($arr,$left,$right){
        if($left == $right){
            return;
        }
        $mid = ceil((($right - $left)/2) + $left);//($right + $left)/2 这种思考内存溢出的优化
        $arr = $this->recursionMergeSort($arr,$left,$mid-1); //递归思维,交给上层解决排序
        $arr = $this->recursionMergeSort($arr,$mid,$right);//递归思维,交给上层解决排序
        $arr = $this->twoMergeSort($arr,$left,$mid,$right);//merge 两部有序内容
        return $arr;
    }
}

4.演示输入代码如下

<?php
//require 'merge_arr.php';
require 'MergeSort.php';
$mergeSort = new MergeSort();
print_r($mergeSort->arrayMergeSort([1,3,2,4,5,9,6,7,8]));

如下图所示:

5. O(nlogn) 和 O(n^2) 工夫复杂度简略比照

代码仓库 :https://gitee.com/love-for-po…

扫码关注爱因诗贤


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP-归并排序Merge-Sort

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址