PHP 实现归并排序算法
算法原理
下列动图来自@五分钟学算法,演示了归并算法的原理和步骤。
原理:
利用递归,先拆分、后合并、再排序。
步骤:
- 均分数列为两个子数列
- 递归重复上一步骤,直到子数列只有一个元素
- 父数列合并两个子数列并排序,递归返回数列
代码实现
// 归并排序主程序
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 实现归并排序算法相关推荐
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- JavaScript实现MergeSort归并排序算法(附完整源码)
JavaScript实现MergeSort归并排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 MergeSort.js完整源代码 Comparator.js完整 ...
- C语言merge sort归并排序算法(附完整源码)
C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...
- python 归并排序算法_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- 排序算法:归并排序算法实现及分析
归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...
- 算法竞赛——归并排序算法
算法竞赛--归并排序算法 分治法 划分问题:把序列分成元素个数尽量相等的两半 递归求解:把两半元素分别排序 合并问题:把两个有序表合并成一个 借鉴RuJia的精妙的合并过程 void merges2( ...
- 有序序列的二分查找、冒泡排序、归并排序算法实战解析
本节开始讲解一下几个简单的算法,原理都在那本书上,大家自己看吧,我就不做搬运工了,这里不同的是,我把vector接口函数单独拿出来进行测试了,深深的体会到算法的奥妙之处,等你深入理解了你会情不自禁拍案 ...
- 第十五周 项目三 归并排序算法的改进
/* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目3.cpp * 作 者:孙仁圆 * 完成日期:2017年12 ...
- C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学
1. 前言 排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. 希尔.归并.快速排序算法也可归为同一类,它们的共同点都是建立在分治思 ...
- 排序算法系列:归并排序算法
概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...
最新文章
- 【重磅】Tensorflow2.0实现29种深度强化学习算法大汇总
- 没有找到 html 模板,Spring Boot and Thymeleaf:找不到HTML模板
- 计算机专业毕业论文的参考文献,计算机专业毕业专著类参考文献 计算机专业毕业论文参考文献哪里找...
- SMW0上传模板下载到本地
- [外文理解] DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构。
- 推理集 —— 思维的误区
- CentOS 配置软raid
- jq之$(“a[target=‘_blank‘]“)
- id,rowid,rownum 区别
- 异常检测: 多元高斯分布
- Objective-C原理系列(一)
- Web安全攻防渗透测试
- 5G工业无线网关是什么?5G工业无线网关可以实现哪些功能?
- 只言片语 —— eFPGA
- 国内免费的mqtt测试服务器或者mqtt broker
- 室内地图导航系统基础功能与衍生服务详解
- ArcGIS导出地图是全黑的
- 【翻译】Wide Deep Learning for Recommender Systems--推荐系统的广泛深度学习
- 实现对 2:3 或者3:2的图片进行1:1裁剪
- 凡人修真3D(3)神翼