【算法】归并排序(MergeSort)
1.简介
时间复杂度(time complexity)
:
Average: O(nlogn)
Worst: O(nlogn)
空间复杂度(space comlexity)
: O(n)
2.算法思想
归并排序是分治法(Divide and Conquer)的典型应用之一。其思想是将一个序列切割为最小单位的子序列(即只有一个元素的序列),使每个子序列有序(一个元素必然有序啦),再将有序的子序列两两合并(重点操作),保证合并后的序列仍然有序。
3.实现步骤
l: 最左元素的index r:最右元素的Index
1.判断参数有效,作为递归的出口。
l < r
2.找到中间点m,将一个序列分为两个子序列
m = (r+l) / 2
3.对第一个子序列调用mergeSort
mergeSort(arr,l,m)
4.对第二个子序列调用mergeSort
mergeSort(arr,m+1,r)
5.将排序好的两个子序列合并在一起且保证合并后的序列有序
merge(arr,l,m,r)
4.代码
static void merge(int[] arr, int l, int m, int r) {
int[] temp = new int[arr.length];
int k = l;
int p = m + 1;
int index = 0;
while (k <= m || p <= r) {
if (k <= m && p <= r) {
temp[index++] = arr[k] < arr[p] ? arr[k++] : arr[p++];
} else {
if (k <= m) {
temp[index++] = arr[k++];
} else {
temp[index++] = arr[p++];
}
}
}
for (int i = 0; i < index; i++) {
arr[l + i] = temp[i];
}
}
static void mergeSort(int[] arr, int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
标签:
算法与数据结构
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器