归并排序算法的Java实现详解
需积分: 15 105 浏览量
更新于2025-01-02
收藏 2KB ZIP 举报
资源摘要信息:"归并排序(Merge Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序的工作原理是将原始数组分成较小的数组,直到每个小数组只有一个位置,然后将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。因为归并排序总是将数组分成两半,因此它是一个分而治之的算法。由于它在排序时需要与原始数组同样大小的额外空间进行合并操作,所以归并排序不是原地排序算法。
在Java中实现归并排序算法通常涉及以下几个步骤:
1. 分割:将数组分割成两半。
2. 合并:将两个有序的半段数组合并成一个有序数组。
具体操作如下:
- 首先,将数组从中间分割成两个子数组。
- 对每个子数组递归地应用归并排序,直到每个子数组只有一个元素(可以认为是已经排序的数组)。
- 然后,将排序好的子数组按照顺序合并起来,形成一个完全排序好的数组。
以下是归并排序在Java中的一个简单实现示例:
```java
public class MergeSort {
// 主函数,用于测试
public static void main(String[] args) {
int[] array = {9, 3, 1, 5, 13, 12, 7};
MergeSort mergeSort = new MergeSort();
mergeSort.sort(array, 0, array.length - 1);
System.out.println("Sorted array:");
for (int value : array) {
System.out.print(value + " ");
}
}
// 归并排序函数
public void sort(int[] array, int left, int right) {
if (left < right) {
// 找到中间位置
int middle = (left + right) / 2;
// 对左边进行排序
sort(array, left, middle);
// 对右边进行排序
sort(array, middle + 1, right);
// 合并两部分
merge(array, left, middle, right);
}
}
// 合并函数
public void merge(int[] array, int left, int middle, int right) {
// 找到左右两个子数组的大小
int n1 = middle - left + 1;
int n2 = right - middle;
// 创建临时数组
int[] L = new int[n1];
int[] R = new int[n2];
// 复制数据到临时数组
System.arraycopy(array, left, L, 0, n1);
System.arraycopy(array, middle + 1, R, 0, n2);
// 合并临时数组回到原数组
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
array[k] = L[i];
i++;
} else {
array[k] = R[j];
j++;
}
k++;
}
// 复制剩余的L[],如果有的话
while (i < n1) {
array[k] = L[i];
i++;
k++;
}
// 复制剩余的R[],如果有的话
while (j < n2) {
array[k] = R[j];
j++;
k++;
}
}
}
```
在上述Java代码中,`sort`方法是归并排序的主要方法,它递归地将数组分成更小的部分,并对它们进行排序。`merge`方法用于合并两个已排序的部分。当数组只有一个元素或为空时,就被认为是排序好的。递归继续直到子数组不能进一步分割,然后开始通过`merge`方法合并这些子数组,最终形成一个完全有序的数组。
归并排序的优点在于它有稳定的O(n log n)时间复杂度,对于大型数据集来说非常高效。并且,由于其稳定性和对链表等非连续存储结构的良好支持,归并排序在某些特定应用中非常有用。"
点击了解资源详情
点击了解资源详情
点击了解资源详情
337 浏览量
416 浏览量
386 浏览量
113 浏览量
2021-07-14 上传
点击了解资源详情
种阳台
- 粉丝: 18
- 资源: 4512
最新资源
- Lista_de_Exercicios:Lista deExercíciode Algoritmos do Gustavo Guanabara教授
- rust-cas:通过构建与Bazel兼容的内容可寻址商店来测试Rust
- 网络刀客 v3.0
- TW-Shiraz:Shiraz是Tiddlywiki 5的一个小型插件,包含宏,样式表,模板,片段,图像,静态表,动态表,并充当入门工具包
- vc_static_button.rar_RFW_VC static Button_VC++ static Button
- 行业文档-设计装置-一种折叠式太阳能座椅广告棚.zip
- pid控制器代码matlab-Ziegler-Nichols-Tuning-Method:使用Ziegler-Nichols闭环方法针对给定传
- CompletableFuture.zip
- 纯css制作文字随时间变动而变色,文字变色效果,背景透明阴影
- up4
- Curriculum_Vitae:职务経歴书
- 粒子群多目标-程序.rar_UY9_pareto_pareto多目标_多目标 粒子群_自适应粒子群
- 行业文档-设计装置-一种折纸机的机头.zip
- englishTeachers:使用Postgresql的简单应用
- SSM实验室预约管理系统.7z
- ESP8266-01GPIO口模拟I2C LCD1602.rar