网站首页 > 文章精选 正文
归并排序(Merge Sort)是常见的一种排序算法,具有时间复杂度稳定、效率高等优点。
一、算法原理
归并排序是一种使用分治策略实现的排序算法,其主要思路是将一个待排序的序列不断分割成小的子序列,直到每个子序列只包含一个元素,然后合并相邻的子序列,最终得到一个完全有序的序列。
归并排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。这个时间复杂度并不是最优解,但是归并排序的实际运行速度比较快,尤其当数据量很大时。
归并排序的空间复杂度为O(n),其中n为待排序序列的长度。由于归并排序需要一个辅助数组来合并子序列,因此其空间复杂度比较高。
1、步骤
下面我们以升序排列为例,对归并排序的具体实现进行阐述:
① 将待排序序列分割。将待排序序列按照二分法进行分割,得到两个子序列;
② 递归分割子序列。对于左右两个子序列分别进行递归处理,重复步骤①,直到不能再分割为止;
③ 合并子序列。将两个有序的子序列合并成一个有序的序列,直到最终合并为一个完全有序的序列。
2、示例
下面给出一个包含10个元素的数组进行归并排序的示例,以便更好地理解算法原理:
二、Java实现代码示例
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[arr.length];
// i指向左半部分元素的起始位置,j指向右半部分元素的起始位置,k指向temp数组的起始位置
int i = left;
int j = mid + 1;
int k = left;
// 比较左右部分元素大小,取最小值放入temp数组中
while(i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 将剩余的左半部分元素依次放入temp数组中
while(i <= mid){
temp[k++] = arr[i++];
}
// 将剩余的右半部分元素依次放入temp数组中
while(j <= right){
temp[k++] = arr[j++];
}
// 将temp数组中排好序的元素复制到原数组中
for (int s = left; s <= right; s++) {
arr[s] = temp[s];
}
}
// 主函数
public static void main(String[] args){
// 待排序数组
int[] arr = {38, 27, 43, 3, 9, 42, 10};
// 对数组进行归并排序
mergeSort(arr, 0, arr.length - 1);
// 输出排序结果
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
在代码实现中,我们利用递归的思想不断将待排序序列分割成更小的子序列。mergeSort()方法用于递归分割子序列,merge()方法用于合并子序列,实现过程中利用了额外的数组temp进行辅助排序。
三、动图演示效果
在动图中,首先将数组每个元素拆分成大小为1的分区,用不同颜色表示每个分区,然后递归合并相邻分区,直到全部合并完毕。
- 上一篇: 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)