Java堆排序算法详解与实现
9 浏览量
更新于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环境中运行,对输入数组进行升序排序。
2020-05-31 上传
166 浏览量
2020-09-02 上传
2020-09-02 上传
2020-09-03 上传
2020-08-31 上传
2020-08-31 上传
2024-05-07 上传
2020-08-30 上传
weixin_38606206
- 粉丝: 3
- 资源: 926
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库