怎么用Java编程堆排序技术
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本篇内容介绍了"怎么用Java编程堆排序技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!堆排序基本
千家信息网最后更新 2025年02月04日怎么用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安全错误
数据库的锁怎样保障安全
北京千指互动网络技术有限公司
数据库热备切换
门头沟网络安全教育平台
客户信息数据库的安全性
南昌市网络安全工程师培训
hpc7000服务器面板没显示
网络技术周刊
二手房软件开发新房源神器
人工智能产品软件开发
java文件上传到服务器在哪
还原数据库把哪个服务停止
软件开发公司营业执照
赴日软件开发 嵌入式
镇海苹果软件开发
大埔租房网络安全
ios软件开发案例
润乾软件开发
软件开发是固定资产吗
测试仪器网络安全
如何实时写股票数据进数据库
传奇游戏服务器租用
服务器售后流程
利辛软件开发
矿区数据库建立
数据库源改名
沈阳app软件开发公司如何选择
网络云存储服务器配置
信控平台数据库服务器
软件开发视频教学视频教程
信息系统软件开发基础