怎么用Java编程堆排序技术
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"怎么用Java编程堆排序技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!堆排序基本
千家信息网最后更新 2026年11月03日怎么用Java编程堆排序技术
本篇内容介绍了"怎么用Java编程堆排序技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
堆排序基本介绍
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最好、最坏、平均时间复杂度均为O(nlogn),它是不稳定排序。
堆是具有以下性质的完全二叉树:每个节点的值都大于等于其左右子节点的值,称为大顶堆,注意:没有要求最有子节点值得大小关系。
每个节点的值都小于等于左右子节点的值,称为小顶堆。
大顶堆的特点:arr[i ] >= arr[2i+1] && arr[i] >= arr[2i+2], i 对应第几个节点,i 从编号0开始。
小顶堆的特点: arr[i ] <= arr[2i+1] && arr[i] <= arr[2i+2], i 对应第几个节点,i 从编号0开始。
一般升序采用大顶堆,降序采用小顶堆。
堆排序基本思想
将待排序序列构造成一个大顶堆
此时,整个序列的最大值就是堆顶的根节点。
将其与数组末尾元素进行交换,此时末尾就为最大值。
然后将剩余 n-1 个元素重新构建成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列。
可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后得到一个有序序列了
一个数组中非叶子节点的个数 = arr.length / 2 - 1
代码案例
package com.xie.tree; public class HeapSort { public static void main(String[] args) { int[] arr = new int[8000000]; for (int i = 0; i < 8000000; i++) { arr[i] = (int) (Math.random() * 800000000); } long start = System.currentTimeMillis(); heapSort(arr); long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start) + "ms"); /** * 800万数据 * 堆排序!! * 耗时:2482ms */ } public static void heapSort(int[] arr) { int temp = 0; System.out.println("堆排序!!"); //1.将无序序列构成一个堆,根据升序降序需求选择大顶堆或小顶堆 for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } //2.将堆顶元素与数组末尾元素交换,将最大元素"沉"到数组末端 //3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。 for (int j = arr.length - 1; j > 0; j--) { //交换 temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); } } /** * 将一个数组(二叉树),调整成一个大顶堆 * 功能:完成将以 i 对应的非叶子节点的树调整成大顶堆 * * @param arr 待调整的数组 * @param i 表示非叶子节点在数组的索引 * @param length 表示对多少个元素进行调整,length在逐渐减少 */ public static void adjustHeap(int[] arr, int i, int length) { //先取出当前元素的值,保存在临时变量 int temp = arr[i]; //k = 2 * i + 1 是i节点的左子节点 for (int k = 2 * i + 1; k < length; k = k * 2 + 1) { //当左子节点值小于右子节点值 if (k + 1 < length && arr[k] < arr[k + 1]) { k++;//k指向右子节点 } //如果子节点值大于父节点值 if (arr[k] > temp) { //把较大的值赋给当前节点 arr[i] = arr[k]; //!!! i指向k 继续循环比较 i = k; } else { break; } } //当for循环结束后,我们已经将以 i 为父节点的树的最大值,放在了最顶。 //将temp值放到调整后的位置 arr[i] = temp; } }"怎么用Java编程堆排序技术"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
节点
元素
排序
数组
调整
序列
最大
末尾
有序
叶子
最大值
技术
编程
个数
内容
更多
案例
特点
知识
结构
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技
科技互联网
上海挚品互联网科技有限公司
喔噻互联网科技有限公司
华服互联网科技怎么样
科技股互联网
互联网属科技
顺玮阁互联网科技
齐家互联网科技有限公司
四川狮子座互联网科技
联恩商钥互联网科技有限公司
恒银科技与互联网金融
团飞科技与伯堂互联网服务平台
互联网企业和科技型企业
乌鲁木齐新华智原互联网科技学校
互联网公司高科技产品
35岁以上互联网科技行业
北京互联网科技类企业分布
平安好医生打造互联网科技医疗
广东猫王互联网科技有限公司电话
广州淘业互联网络科技
山东特亿宝互联网科技有限公司
互联网科技垄断
重庆互联网络科技
智网互联网科技
齐家互联网科技有限公司
威龙国际互联网科技公司
半导体行业属于互联网高科技类吗
杭州融税互联网科技有限公司
重庆科技产业互联网有哪些
