PHP数据结构(二十五) ——并归排序
时间:2022-05-03
本文章向大家介绍PHP数据结构(二十五) ——并归排序,主要内容包括PHP数据结构(二十四) ——堆排序、PHP数据结构(二十三) ——快速排序、PHP数据结构(二十二) ——快速排序、PHP数据结构(二十一) ——希尔排序、PHP数据结构(二十) ——其他插入排序、PHP数据结构(十九) ——B+树、PHP数据结构(十八) ——直接插入排序、PHP数据结构(十七) ——内部排序综述、PHP数据结构(十六) ——B树、PHP数据结构(十五) ——哈希表、PHP数据结构(十四) ——键树(双链树)、PHP数据结构(十三) ——动态查找表(二叉排序树)、PHP数据结构(十二) ——静态查找表、PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)、PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)、PHP数据结构(十) ——有向无环图与拓扑算法、PHP数据结构(九) ——图的定义、存储与两种方式遍历、PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)、PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践1)、PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)、PHP数据结构(七) ——串与实现KMP算法、PHP数据结构(六) ——树与二叉树之概念及存储结构、PHP数据结构(六) ——数组的相乘、广义表、PHP数据结构(五) ——数组的压缩与转置、PHP数据结构(四) ——队列、PHP数据结构(三)——运用栈实现括号匹配、PHP数据结构(二)——链式结构线性表、PHP数据结构(一)——顺序结构线性表、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
PHP数据结构(二十五)——并归排序
(原创内容,转载请注明来源,谢谢)
一、概述
并归排序是将两个或两个以上的有序表组合成一个新的有序表。采用并归的思想进行排序的方式如下:
假设初始序列含有n个记录,则看成是n个有序的子序列,每个子序列长度是1,然后两两合并,得到n/2个长度为2或者1(元素总数是奇数时,最后一个元素是单个的)的子序列。然后再进行归并,直至归并成一个数组。此方法也成为2-路并归排序。
二、算法
并归排序有两个核心——拆分、合并。
1)对于拆分,需要把数组拆成仅含一个元素的数组。
2)对于合并,两两合并的过程中再进行排序。
三、程序实现过程
1)获取数组,取数组长度的一半作为中间值,将数组分割成两部分。并用递归的方式将数组拆成更小的模块。直到数组都是一个元素。
2)将数组递归合并,边合并边进行比较,确保合并后的数组是从小到大排好序的数组,合并后返回给上一层。
四、并归排序图(图片来自网络)
五、实现源程序
//并归排序
publicfunction mergeSortArray(array $arr = array()){
if(empty($arr)){
$arr= $this->arr;
}
$arrLength= count($arr);
//长度只有1直接返回
if(1>= $arrLength){
return$arr;
}
//取中间值作为下标
$middle= floor($arrLength/2);
//分割出左数组,从0到中间
$arrLeft= array_slice($arr, 0, $middle);
//分割出右数组,从中间到最后
$arrRight= array_slice($arr, $middle, $arrLength-1);
//采用递归的方式进行分割
$arrLeft= $this->mergeSortArray($arrLeft);
$arrRight= $this->mergeSortArray($arrRight);
$arr= $this->_mergeSplitedArray($arrLeft, $arrRight);
return$arr;
}
//并归排序的私有方法,将两个数组有序合并
publicfunction _mergeSplitedArray(array $arrLeft, array $arrRight){
$arrRes= array();
$leftIndex= 0;
$rightIndex= 0;
//遍历数组,合成最终的数组
while($leftIndex< count($arrLeft) && $rightIndex < count($arrRight)){
//如果左边小,则取左边的值,并把左边的下标加一。否则取右边的值,并把右边的下标加一。
$arrRes[]= $arrLeft[$leftIndex] < $arrRight[$rightIndex] ? $arrLeft[$leftIndex++] :$arrRight[$rightIndex++];
}
//将其中一边数组剩余的结果合并进来,下面两个while会执行其中一个
while($leftIndex< count($arrLeft)){
$arrRes[]= $arrLeft[$leftIndex++];
}
while($rightIndex< count($arrRight)){
$arrRes[]= $arrRight[$rightIndex++];
}
return$arrRes;
}
——written by linhxx 2017.07.20
相关阅读:
PHP数据结构(二十四) ——堆排序
PHP数据结构(二十三) ——快速排序
PHP数据结构(二十二) ——快速排序
PHP数据结构(二十一) ——希尔排序
PHP数据结构(二十) ——其他插入排序
PHP数据结构(十九) ——B+树
PHP数据结构(十八) ——直接插入排序
PHP数据结构(十七) ——内部排序综述
PHP数据结构(十六) ——B树
PHP数据结构(十五) ——哈希表
PHP数据结构(十四) ——键树(双链树)
PHP数据结构(十三) ——动态查找表(二叉排序树)
PHP数据结构(十二) ——静态查找表
PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)
PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)
PHP数据结构(十) ——有向无环图与拓扑算法
PHP数据结构(九) ——图的定义、存储与两种方式遍历
PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)
PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践1)
PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)
PHP数据结构(七) ——串与实现KMP算法
PHP数据结构(六) ——树与二叉树之概念及存储结构
PHP数据结构(六) ——数组的相乘、广义表
PHP数据结构(五) ——数组的压缩与转置
PHP数据结构(四) ——队列
PHP数据结构(三)——运用栈实现括号匹配
PHP数据结构(二)——链式结构线性表
PHP数据结构(一)——顺序结构线性表
- 缓冲区溢出攻击初学者手册(更新版)
- 在Python机器学习中如何索引、切片和重塑NumPy数组
- HelloWorld,我的第一趟旅程出发点
- Android OpenGL开发实践 - GLSurfaceView对摄像头数据的再处理
- 走进科学:对七夕“超级病毒”XX神器的逆向分析
- 机器学习 - 朴素贝叶斯分类器的意见和文本挖掘
- 认知指纹:颠覆性的身份认证技术
- 跟我学姿势:极客教你如何科学的看电影
- Discuz 5.x/6.x/7.x投票SQL注入分析
- 论如何高效的挖掘漏洞
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- 走进科学:如何正确的隐藏自己的行踪
- 比特儿(Bter.com) 比特币交易平台被盗事件全解析
- BitTorrent Bleep:无法被监控的聊天软件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实战丨用云开发快速构建信息申报小程序
- Linux gdb使用基础
- redis设置过期时间
- Linux gcc使用基础
- TensorFlow-平面曲线拟合
- TensorFlow-VGG16模型复现
- 腾讯云语音识别之实时语音识别
- React + Dva + Antd+umi 实践
- 重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现
- Android数据库存储模块封装,让操作记录更好用可复用
- lucene的高效数据查询
- protobuf在java, Android下的使用总结
- 一种MVVM风格的Android项目架构浅析
- lucene实例与源码解析
- CloudSim 的详解与调度扩展实现