网站首页 > 文章精选 正文
归并排序是一种基于分治思想的排序算法,它的时间复杂度为 O(nlogn)。
归并排序的基本思路是:将一个大问题分解成若干个小问题,逐步解决这些小问题,最终合并成一个解决方案。在归并排序中,我们将待排序的数组分成两个子数组,分别对这两个子数组进行排序,
然后将它们合并成一个有序的数组。
具体实现如下:
public class MergeSort {
public static void mergeSort(int[] arr, int left, int right) {
// 递归终止条件
if (left < right) {
// 计算中间位置
int mid = (left + right) / 2;
// 递归调用左半部分
mergeSort(arr, left, mid);
// 递归调用右半部分
mergeSort(arr, mid + 1, right);
// 合并左右两个有序数组
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr, int left, int mid, int right) {
// 创建一个临时数组,用于存储合并后的结果
int[] temp = new int[right - left + 1];
// 定义三个指针,分别指向原数组的左右两端和临时数组的左右两端
int i = left, j = mid + 1, k = 0;
// 合并左右两个有序数组
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 将左半部分剩余的元素复制到临时数组中
while (i <= mid) {
temp[k++] = arr[i++];
}
// 将右半部分剩余的元素复制到临时数组中
while (j <= right) {
temp[k++] = arr[j++];
}
// 将临时数组中的元素复制回原数组中
for (i = left, k = 0; i <= right; i++, k++) {
arr[i] = temp[k];
}
}
}
在这个实现中,我们首先将待排序的数组分成两个子数组,分别对这两个子数组进行递归排序,最后将它们合并成一个有序的数组。合并的过程是:将两个子数组合并成一个新的数组,然后比较新数组中相邻的两个元素,将较小的元素向前移动,直到新数组中的所有元素都是有序的。
归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。它的优点是稳定性好,缺点是需要额外的空间来存储临时数组。
注:点赞关注有更多技术交流期待哦
- 上一篇: 归并排序(归并排序代码)
- 下一篇: 看动图学算法(七):归并排序的原理和Java讲解
猜你喜欢
- 2025-06-24 算法基础:插入排序 实现原理和应用场景
- 2025-06-24 基础数据结构——八大排序详解(数据结构八种排序算法的思想)
- 2025-06-24 C#程序员必知:如何让你的代码跑得比火箭还快!深度优化实践指南
- 2025-06-24 数据结构与算法之道:解读常数、线性、对数时间复杂度!
- 2025-06-24 排序算法—快速排序(快速排序算法总结)
- 2025-06-24 Python高级排序算法应用(python3 排序算法)
- 2025-06-24 大数据高频面试题之算法题(大数据技术之高频面试题)
- 2025-06-24 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
- 2025-06-24 面试常考八股文及算法(一)(八股文的要求)
- 2025-06-24 技术分享:这可能最快的稳定排序算法
- 06-24PLC常用进制数及转换方法(plc中进制符号)
- 06-24PLC常用数制及转换方法,让你轻松掌握PLC编程
- 06-24PLC编程必看!5种常见进制数解析,搞懂才能玩转PLC!
- 06-24C数据类型——常量(c的数据类型及其定义方法)
- 06-24什么是二进制、八进制、十进制、十六进制?
- 06-24理论基础——十进制、二进制、十六进制、八进制
- 06-24搞不懂PLC中的高字节、低字位是啥?看完这篇文章就懂了!
- 06-242、进位制之间的转换(含有小数位)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)