归并排序也有类似于快速排序的 切割 的过程,但是快速排序会选择基准值,而归并排序则直接将列表 尽可能两等分(若长度为奇数,那么有一侧会少一个元素,左侧还是右侧是无妨的)。当分割到左右两侧都只剩下一个元素的时候,分割完成,开始往上层拼接结果。拼接的大致流程是:取左右两侧队首的元素,比较两者大小,较小的先进入已排序列表。重复执行此流程,直至有一侧为空,将另一侧剩余元素直接合并到已排序列表的右侧。归并排序也是一种“分治法”,将问题分割到不可再分割的最小单元,然后开始往回执行,最终得到结果,它同样要使用递归。。以下是归并排序的执行流程示意图:
- 归并排序执行流程及结果:
附
PHP
实现代码:
<?php
function merge($arrayNeedsSort)
{
if (empty($arrayNeedsSort) || count($arrayNeedsSort) <= 1) {
// 基准条件,退出
return $arrayNeedsSort;
} else {
$res = [];
$left = [];
$right = [];
$length = count($arrayNeedsSort);
if ($length % 2 == 0) {
// 长度为偶数,对半分
list($left, $right) = array_chunk($arrayNeedsSort, ($length / 2));
} else {
// 长度为奇数,左侧比右侧少一
list($left, $right, $last) = array_chunk($arrayNeedsSort, (($length - 1) / 2));
// 切割后将剩余的一个元素补到右侧的列表末尾
$right[] = $last[0];
}
// 先对左侧进行排序
$left = merge($left);
// 再对右侧进行排序
$right = merge($right);
$flag = count($left) + count($right);
while ($flag > 0)