Java堆排序算法详解与实现
38 浏览量
更新于2024-09-01
收藏 87KB PDF 举报
"Java排序算法之堆排思想及代码实现"
在计算机科学中,堆排序是一种基于比较的排序算法,其核心思想是利用了数据结构中的堆(Heap)概念。堆是一个近似完全二叉树的结构,同时满足堆的性质:在大顶堆中,每个节点的值都大于或等于其子节点的值;在小顶堆中,则相反。Java中的堆排序主要分为两个阶段:构建堆和调整堆。
1. 构建堆(Heapify):
- 从最后一个非叶子节点开始,自底向上、自右向左遍历数组。对于每个节点,如果其值小于其子节点,就交换它们的位置,以确保该节点成为其子树的大顶堆根节点。
- 这个过程从倒数第二个非叶子节点((n/2)-1,其中n是数组长度)开始,一直进行到根节点(下标为0)。
2. 调整堆(Heapify Down):
- 将数组的最大元素(堆顶元素)与最后一个元素交换,这样最大的元素就被放置到了正确的位置(数组末尾)。
- 将数组的大小减一(n--),此时新数组的大小为n。
- 对剩下的n个元素重新构建大顶堆,这个过程重复,直到数组只剩下一个元素。
以给定的整型数组arr={2,1,3,6,0,5}为例,我们来逐步解释堆排序的过程:
1. 初始化大顶堆:
- 首先,数组arr已经是部分堆,但不是大顶堆。我们需要从第一个非叶子节点(下标为1)开始调整。
- 检查arr[1](值为1),它小于其父节点arr[0](值为2),所以我们保持不变。
- 接着检查arr[2](值为3),发现3大于2,因此交换它们,得到新的数组arr={3,2,1,6,0,5}。
- 现在arr[2](值为1)小于其父节点arr[1](值为2),所以保持不变,堆化完成。
2. 堆排序:
- 将堆顶元素(arr[0])与最后一个元素(arr[5])交换,得到arr={5,2,1,6,0,3},数组大小减一(n=5)。
- 重新构建大顶堆,从arr[1]开始检查,发现1<2,保持不变;接着检查arr[2],发现1<3,保持不变,堆化完成。
- 再次交换堆顶元素(arr[1])与最后一个元素(arr[4]),得到arr={4,2,1,6,3,0},数组大小再次减一(n=4)。
- 继续构建大顶堆,检查arr[1],保持不变;检查arr[2],1<2,保持不变,堆化完成。
- 交换堆顶元素(arr[1])与最后一个元素(arr[3]),得到arr={3,2,1,4,3,0},数组大小为3。
- 构建大顶堆,检查arr[1],保持不变;检查arr[2],1<2,保持不变,堆化完成。
- 最后,交换堆顶元素(arr[1])与最后一个元素(arr[2]),得到arr={2,1,3,4,3,0},数组大小为2,此时arr已经是有序的。
通过上述过程,我们成功地使用堆排序将无序数组arr={2,1,3,6,0,5}转换为了升序排列的数组arr={0,1,2,3,4,5}。
在Java中实现堆排序,我们可以定义一个方法来构建和调整堆,然后在一个循环中不断交换堆顶元素和末尾元素并缩小堆的大小。以下是一个简单的Java代码示例:
```java
public class HeapSort {
public static void sort(int[] arr) {
int n = arr.length;
// 构建大顶堆
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 交换并调整堆
for (int i = n - 1; i > 0; i--) {
swap(arr, 0, i);
heapify(arr, i, 0);
}
}
private static void heapify(int[] arr, int n, int i) {
int largest = i; // 初始化最大值为根节点
int left = 2 * i + 1;
int right = 2 * i + 2;
// 如果左子节点大于根节点,更新最大值
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// 如果右子节点大于当前最大值,更新最大值
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大值不是根节点,交换它们并继续调整
if (largest != i) {
swap(arr, i, largest);
heapify(arr, n, largest);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
```
这个Java代码实现了堆排序的基本逻辑,可以在任何Java环境中运行,对输入数组进行升序排序。
244 浏览量
137 浏览量
297 浏览量
320 浏览量
2024-05-07 上传
301 浏览量
2010-11-01 上传
316 浏览量
136 浏览量
weixin_38606206
- 粉丝: 3
最新资源
- 揭秘嵌入式Linux性能:深度解析与哲思
- Hibernate开发指南:数据库映射到Pojo的实战教程
- Symbian OS 设计模式全书:智能手机软件基石
- .NET面试必备知识点大全
- 利用CPU时间戳实现高精度计时方法
- Pentium处理器的分支预测策略与优化
- InfoQ中文站:深入浅出Struts2电子书-免费在线学习资源
- CVS并发版本系统中文手册v1.12.9:团队开发必备
- UML初学者教程:实例解析类与关系
- Seam深度集成框架:简化企业级应用开发
- 掌握复杂指针教程:解析与实例
- TestInside 310-065 Java SE 6.0 Programmer题库下载与编程练习
- Java与SAP R/3系统的集成技术探索
- 理解银行家算法:C++实现详解
- C# 3.0编程规范详解:从HelloWorld到结构与接口
- 大规模网络异常检测:滤波与统计方法的融合策略