## 归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
- 平均时间复杂度:O(nlogn)
- 最佳时间复杂度:O(n)
- 最差时间复杂度:O(nlogn)
- 空间复杂度:O(n)
- 排序方式:In-place
- 稳定性:稳定
参考来源:https://www.cnblogs.com/chengxiao/p/6194356.html
《大话数据结构》
以下是php版本:
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2021/4/8 0008
* Time: 下午 2:33
* 归并排序
*
* 当前需要从小到大进行排序,归并排序的核心思路是,把大的数组,不停地拆成小的数组,直到拆得最小,然后再把小数组两两排序合并,再将结果不停地进行一次次排序的合并。
*
* 步骤1:拆分,将数组进行n/2 n/2拆分,直到每个数组有序,且不能再拆分
* [4,5,6,7,1,3] => [4,5,6] [7,1,3] => [4][5,6] [7],[1,3]
*
* 步骤2:合并排序 将拆分好的小数组进行合并排序。[4][5,6] 合并排序=> [4,5,6] [7],[1,3] 合并排序=> [1,3,7] ,依次递归。
* [4,5,6][1,3,7] 合并排序=> [1,3,4,5,6,7]
*
*
*/
function merge_sort(Array $data,Int $length = 0): Array{
if($length <= 1){
return $data;
}
$s = intval($length / 2);
// echo "s:$s<br>";
$left = array_slice($data,0,$s);
$right = array_slice($data,$s);
// 回调继续拆分
$left = merge_sort($left,count($left));
$right = merge_sort($right,count($right));
// 合并2个数组
return merge($left,$right);
}
// 有序的合并2个数组
function merge($left,$right){
$arr = [];
$len_left = count($left);
$len_right = count($right);
$i = $j = 0;
while (count($arr) < $len_left + $len_right) {
if ($i < $len_left && ($j == $len_right || $left[$i] <= $right[$j])) {
$arr[] = $left[$i];
$i++;
} else if ($j < $len_right && ($i == $len_left || $left[$i] > $right[$j])) {
$arr[] = $right[$j];
$j++;
}
}
return $arr;
};
for ($i = 0 ; $i < 100000 ;$i ++){
$data[] = rand(1000,9999);
}
echo json_encode(merge_sort($data,count($data)));