网站首页 > java教程 正文
归并排序(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的分区,用不同颜色表示每个分区,然后递归合并相邻分区,直到全部合并完毕。
- 上一篇: 【排序】07归并排序
- 下一篇: 图解归并排序
猜你喜欢
- 2025-05-27 2025-04-29:高度互不相同的最大塔高和。用go语言,给定一个数组
- 2025-05-27 PHP排序算法:计数、选择、插入、归并、快速、冒泡、希尔、堆
- 2025-05-27 Python高级排序算法应用
- 2025-05-27 用好RANK函数 跨表排名不用愁
- 2025-05-27 十大排序算法时空复杂度
- 2025-05-27 Excel表格通过拆分再合并的方法对合并单元格排序
- 2025-05-27 万能的vlookup,居然能用来合并同类项,这个公式设计的太巧妙了
- 2025-05-27 算法基础:插入排序 实现原理和应用场景
- 2025-05-27 算法之常见排序算法-冒泡排序、归并排序、快速排序
- 2025-05-27 公式很短,将 Excel 合并单元格中的数据行按大小排序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)