排序算法---归并排序
归并排序是一种稳定的排序算法。
归并操作的算法原理如下:
1.均分数列为两个子数列
2.递归重复上一步骤,直到子数列只有一个元素
3.父数列合并两个子数列并进行比较排序,递归返回数列
数据演示: 待排序数列:26 55 1 91 0 18 8 20 3
均分数列:
[26 55 1 91] | [0 18 8 20 3]
[26 55] [1 91] | [0 18] [8 20 3]
[26] [55] [1] [91] | [0] [18] [8 20] [3]
[26] [55] [1] [91] | [0] [18] [8] [20] [3] //子序列只剩1个元素
[26 55] [1 91] | [0 18] [8 20] [3] //两两比较
[1 26 55 91] | [0 8 18 20] [3]
[1 26 55 91] | [0 3 8 18 20]
[0 1 3 8 18 20 26 55 91]
代码实现:
function mergeSort($arr) {
$len = count($arr);
if($len<=1) { //得到最小单元数组
return $arr;
}
$middle =floor($len/2);
$larr = array_slice($arr,0,$middle);
$rarr = array_slice($arr,$middle); //array_slice():从数组中取出一段
$left = mergeSort($larr);
$right = mergeSort($rarr);
return merge($left,$right);
}
function merge($left,$right) {
$sortArr = [];
while(count($left) && count($right)) {
if($left[0]>=$right[0]) { //注意:这边使用>=而不用>的目的是:保证排序的稳定性
$sortArr[] = array_shift($right); //array_shift():将数组开头的单元移出数组
}else{
$sortArr[] = array_shift($left);
}
}
//左边序列或者右边序列有剩余元素
return array_merge($sortArr,$left,$right); //array_merge():合并一个或多个数组
}
print_r(mergeSort($arr));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】