算法原理

下列动图来自@五分钟学算法,演示了归并算法的原理和步骤。

原理:

利用递归,先拆分、后合并、再排序。

步骤:

  • 均分数列为两个子数列
  • 递归重复上一步骤,直到子数列只有一个元素
  • 父数列合并两个子数列并排序,递归返回数列

代码实现

// 归并排序主程序
function mergeSort($arr) {$len = count($arr);if ($len <= 1) {return $arr;} // 递归结束条件, 到达这步的时候, 数组就只剩下一个元素了, 也就是分离了数组$mid = intval($len / 2); // 取数组中间$left = array_slice($arr, 0, $mid); // 拆分数组0-mid这部分给左边left$right = array_slice($arr, $mid); // 拆分数组mid-末尾这部分给右边right$left = mergeSort($left); // 左边拆分完后开始递归合并往上走$right = mergeSort($right); // 右边拆分完毕开始递归往上走$arr = merge($left, $right); // 合并两个数组,继续递归return $arr;
}// merge函数将指定的两个有序数组(arrA, arr)合并并且排序
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);
}

测试:

$startTime = microtime(1);$arr = range(1, 10);
shuffle($arr);echo "before sort: ", implode(', ', $arr), "\n";
$sortArr = mergeSort($arr);
echo "after sort: ", implode(', ', $sortArr), "\n";echo "use time: ", microtime(1) - $startTime, "s\n";

时间复杂度

归并排序的时间复杂度是 O(N*lgN)

假设被排序的数列中有 N 个数。遍历一趟的时间复杂度是 O(N),需要遍历多少次呢?

归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是 O(N*lgN)

参考资料

  • 归并排序
  • 十大经典排序算法动画与解析

感谢您的阅读,觉得内容不错,点个赞吧 ?

原文地址: https://shockerli.net/post/me...

PHP 实现归并排序算法相关推荐

  1. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  2. JavaScript实现MergeSort归并排序算法(附完整源码)

    JavaScript实现MergeSort归并排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 MergeSort.js完整源代码 Comparator.js完整 ...

  3. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  4. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  5. 排序算法:归并排序算法实现及分析

    归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...

  6. 算法竞赛——归并排序算法

    算法竞赛--归并排序算法 分治法 划分问题:把序列分成元素个数尽量相等的两半 递归求解:把两半元素分别排序 合并问题:把两个有序表合并成一个 借鉴RuJia的精妙的合并过程 void merges2( ...

  7. 有序序列的二分查找、冒泡排序、归并排序算法实战解析

    本节开始讲解一下几个简单的算法,原理都在那本书上,大家自己看吧,我就不做搬运工了,这里不同的是,我把vector接口函数单独拿出来进行测试了,深深的体会到算法的奥妙之处,等你深入理解了你会情不自禁拍案 ...

  8. 第十五周 项目三 归并排序算法的改进

    /* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目3.cpp * 作 者:孙仁圆 * 完成日期:2017年12 ...

  9. C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学

    1. 前言 排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. 希尔.归并.快速排序算法也可归为同一类,它们的共同点都是建立在分治思 ...

  10. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

最新文章

  1. 【重磅】Tensorflow2.0实现29种深度强化学习算法大汇总
  2. 没有找到 html 模板,Spring Boot and Thymeleaf:找不到HTML模板
  3. 计算机专业毕业论文的参考文献,计算机专业毕业专著类参考文献 计算机专业毕业论文参考文献哪里找...
  4. SMW0上传模板下载到本地
  5. [外文理解] DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构。
  6. 推理集 —— 思维的误区
  7. CentOS 配置软raid
  8. jq之$(“a[target=‘_blank‘]“)
  9. id,rowid,rownum 区别
  10. 异常检测: 多元高斯分布
  11. Objective-C原理系列(一)
  12. Web安全攻防渗透测试
  13. 5G工业无线网关是什么?5G工业无线网关可以实现哪些功能?
  14. 只言片语 —— eFPGA
  15. 国内免费的mqtt测试服务器或者mqtt broker
  16. 室内地图导航系统基础功能与衍生服务详解
  17. ArcGIS导出地图是全黑的
  18. 【翻译】Wide Deep Learning for Recommender Systems--推荐系统的广泛深度学习
  19. 实现对 2:3 或者3:2的图片进行1:1裁剪
  20. 凡人修真3D(3)神翼

热门文章

  1. Android多开和虚拟化--Docker概念的详细介绍
  2. android dip转px
  3. memcpy和memmove的区别
  4. Java集合—List如何一边遍历,一边删除?
  5. 系列(三)—Redis
  6. Selenium对于对话框alert,confirm,prompt的处理
  7. HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
  8. 关于Socket建立长连接遇到的bug信息
  9. 推荐9部让你看到酣畅淋漓的复仇电影
  10. Javascript实现MD5加密