排序算法值归并排序


归并排序

一、工作原理

1、描述

  归并排序实际上是将一个数组分成不能再分为止,然后两两对比,将小的放在前面,然后按照从小到达的分裂顺序,往上走,最后合并两个数组即可。

2、图解

二、源代码

<?php
function merge($arrA,$arrB)
{
    $arrC = array();
    while(count($arrA) && count($arrB)){
        //这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,
        //不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用
        $arrC[] = $arrA[0] < $arrB[0] ? array_shift($arrA) : array_shift($arrB);
    }
    return array_merge($arrC, $arrA, $arrB);
}
//归并排序主函数
function MergeSort($arr){
    $len=count($arr);
    if($len <= 1)
        return $arr;//递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
    $mid = intval($len/2);//取数组中间
    $left_arr = array_slice($arr, 0, $mid);//拆分数组0-mid这部分给左边left_arr
    $right_arr = array_slice($arr, $mid);//拆分数组mid-末尾这部分给右边right_arr
    $left_arr = MergeSort($left_arr);//左边拆分完后开始递归合并往上走
    $right_arr = MergeSort($right_arr);//右边拆分完毕开始递归往上走
    $arr=merge($left_arr, $right_arr);//合并两个数组,继续递归
    return $arr;
}
$arr = [4,6,3,0,1,2,7,9,8,5];
$data = MergeSort($arr);
var_dump($data);

注意:

1、两个数组比较最后肯定剩下元素,不是A就是B,这是要把数组里面剩的追加到临时数组的后面。

三、性能分析

排序类别 排序方法 时间复杂度 空间复杂度 稳定性
平均情况 最坏情况 最好情况
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定

优质内容筛选与推荐>>
1、CSS3-新属性-结构选择器
2、Exceptions vs Error Codes (异常还是错误代码)
3、What-are-prerequisites-for-learning-Artificial-Intelligence
4、Subsequence Sum Queries
5、Java 异常


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号