怎么用Java编程堆排序技术
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,本篇内容介绍了"怎么用Java编程堆排序技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!堆排序基本
千家信息网最后更新 2025年11月14日怎么用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安全错误
数据库的锁怎样保障安全
账户数据库
广电网络安全生产先进事迹
怎么连接ftp 服务器
点真互联网上海科技有限公司
网络安全的哲学原理
联想服务器改中文
福建广电网络技术部
数学文献数据库
惠普服务器无法启动进入系统
万达网络安全示范
学校网络安全管理要点分析
代理服务器是怎么用
大学生网络安全小论文题目
优讯时代网络技术南京
手机拍照上传到服务器
互联网金融科技市场
宁波软件开发公司靠谱吗
打印名字怎么导入数据库
云服务器挂几个店铺
网络安全岗位怎么入行
皇朝网络安全专业
北京诚信网络技术开发哪个正规
长沙网络安全检查工作
马尾租房软件开发
嵌入式软件开发 软考
手机网络安全隐患排查治理
网络安全产业园 西集
课程表数据库需求分析
网络安全省级以上政府采取措施
要成为软件开发工程师计划
