优化堆排序(Java 实例代码)

目录

优化堆排序

[Java 实例代码](#Java 实例代码)

[src/runoob/heap/HeapSort.java 文件代码:](#src/runoob/heap/HeapSort.java 文件代码:)


优化堆排序

上一节的堆排序,我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节,我们进行优化,使用原地堆排序。

对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾就是最大元素,然后再对W元素进行 shift down 操作,重新生成最大堆,然后将新生成的最大数和整个数组倒数第二位置进行交换,此时倒数第二位置就是倒数第二大数据,这个过程以此类推。

整个过程可以用如下图表示:

Java 实例代码

源码包下载: Downloadhttps://www.runoob.com/wp-content/uploads/2020/09/runoob-algorithm-HeapSort.zip

src/runoob/heap/HeapSort.java 文件代码:

package runoob.heap;

import runoob.sort.SortTestHelper;

/**

* 原地堆排序

*/

public class HeapSort<T extends Comparable> {

public static void sort(Comparable[] arr) {

int n = arr.length;

// 注意,此时我们的堆是从0开始索引的

// 从(最后一个元素的索引-1)/2开始

// 最后一个元素的索引 = n-1

for (int i = (n - 1 - 1) / 2; i >= 0; i--)

shiftDown(arr, n, i);

for (int i = n - 1; i > 0; i--) {

swap(arr, 0, i);

shiftDown(arr, i, 0);

}

}

// 交换堆中索引为i和j的两个元素

private static void swap(Object[] arr, int i, int j) {

Object t = arr[i];

arr[i] = arr[j];

arr[j] = t;

}

// 原始的shiftDown过程

private static void shiftDown(Comparable[] arr, int n, int k) {

while (2 * k + 1 < n) {

//左孩子节点

int j = 2 * k + 1;

//右孩子节点比左孩子节点大

if (j + 1 < n && arr[j + 1].compareTo(arr[j]) > 0)

j += 1;

//比两孩子节点都大

if (arr[k].compareTo(arr[j]) >= 0) break;

//交换原节点和孩子节点的值

swap(arr, k, j);

k = j;

}

}

// 测试 HeapSort

public static void main(String[] args) {

int N = 100;

Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);

sort(arr);

// 将heapify中的数据逐渐使用extractMax取出来

// 取出来的顺序应该是按照从大到小的顺序取出来的

for (int i = 0; i < N; i++) {

System.out.print(arr[i] + " ");

}

// 确保arr数组是从大到小排列的

for (int i = 1; i < N; i++)

assert arr[i - 1] >= arr[i];

}

}

相关推荐
AI进化营-智能译站3 小时前
ROS2 C++开发系列17-多线程驱动多传感器|chrono高精度计时实现机器人同步控制
java·c++·ai·机器人
一切皆是因缘际会7 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
Java成神之路-7 小时前
【LeetCode 刷题笔记】34. 在排序数组中查找元素的第一个和最后一个位置 | 二分查找经典刷题题解
算法·leetcode
qq_589568107 小时前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
不忘不弃7 小时前
用BFS方法求解平分汽油问题
算法·宽度优先
AI科技星7 小时前
全域数学·72分册·射影原本 无穷维射影几何卷细化子目录【乖乖数学】
人工智能·线性代数·算法·机器学习·数学建模·数据挖掘·量子计算
风落无尘7 小时前
《智能重生:从垃圾堆到AI工程师》——第四章 变化的艺术
人工智能·线性代数·算法
JAVA面经实录9177 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦7 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
WBluuue8 小时前
Codeforces 1093 Div2(ABCD1D2)
c++·算法