堆排序(Java)

embedded/2025/1/2 13:29:38/

二叉堆是完全二叉树,或者近似完全二叉树
若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。

二叉树:可以用数组来表示一棵数,如果已经根节点的下标为i,那么它的俩个子节点下标分别为2i+1和2i+2。

二叉堆特征:1、父节点的键值总是大于或等于(小于或等于)任何一个节点的键值;2、每个节点的左子数和右子树都是一个二叉堆
任意节点的值都大于其子节点的值--大顶堆 ;任意节点的值都小于其子节点的值--小顶堆

java">public class Test4 {public static void main(String[] args) {int[] arr = new int[]{65,33,67,9,34,1,56,76,43};//f3(arr);f4(arr);for (int i : arr) {System.out.print(i+" ");}}//堆排序:先把数组堆化,在进行排序,堆的高度为lg(n) ,时间复杂度O(nlg(n))//把数组堆化://1、构建最小堆static void makeMinHeap(int[] arr){for(int i=arr.length/2-1;i>=0;i--){minHeap(arr,i,arr.length);  //从最后一个有子节点的父节点开始。因为左右子节点下标为2i+1或2i+2,所以数组后半段不可能有父节点。}}static void minHeap(int[] arr,int i,int length){int j=2*i+1;  //左节点int temp = arr[i]; //父节点while(j<length){if(j+1 <length && arr[j+1]<arr[j])j++; //找到左右节点中较小的。if(arr[j]<temp){ //如果子节点比父节点还小,就子节点上移到父节点arr[i]=arr[j];i=j;    //然后把较小节点当作父节点,在找较小子节点j=2*i+1;}else{break;}}arr[i] = temp;}//2、构建最大堆static void makeMaxHeap(int[] arr){for(int i=arr.length/2-1;i>=0;i--){maxHeap(arr,i, arr.length);}}static void maxHeap(int[] arr,int i,int length){int j=2*i+1;  //左节点int temp = arr[i]; //父节点while(j<length){if(j+1 <length && arr[j+1]>arr[j])j++; //找到左右节点中较大的。if(arr[j]>temp){ //如果子节点比父节点还大,就子节点上移到父节点arr[i]=arr[j];i=j;    //然后把较大节点当作父节点,在找较大子节点j=2*i+1;}else{break;}}arr[i] = temp;}//对堆降序排序static void f3(int[] arr){//最小堆化makeMinHeap(arr); //此时0下标元素一定为最小值,把该元素与最后一个元素交换位置。for(int i= arr.length-1;i>0;i--){swap(arr,0,i);minHeap(arr,0,i);  //然后缩小范围,再次最小堆化,不包括最后一个元素}}//对堆升序排序static void f4(int[] arr){//最小堆化makeMaxHeap(arr); //此时0下标元素一定为最小值,把该元素与最后一个元素交换位置。for(int i= arr.length-1;i>0;i--){swap(arr,0,i);maxHeap(arr,0,i);  //然后缩小范围,再次最小堆化,不包括最后一个元素}}//交换元素static void swap(int[] arr,int i,int j){int t=arr[i];arr[i]=arr[j];arr[j]=t;}
}


http://www.ppmy.cn/embedded/150262.html

相关文章

Java爬虫实战:获取亚马逊商品评论详解

在电商领域&#xff0c;用户评论是了解产品口碑和市场反馈的重要渠道。亚马逊作为全球领先的电商平台&#xff0c;拥有海量的商品评论数据。本文将介绍如何使用Java编写爬虫程序&#xff0c;从亚马逊网站获取商品评论数据&#xff0c;并提供详细的代码示例。 一、准备工作 在开…

关闭显示器的脚本

一、用BAT脚本关闭显示器 shutdown_monitor.bat %windir%\System32\scrnsave.scr /s 二、用BAT调PowerShell脚本关闭显示器 RunPowerShellScript.bat echo off powershell -NoProfile -ExecutionPolicy Bypass -File “TurnOffMonitor.ps1” pause TurnOffMonitor.ps1 …

【机器学习】机器学习的基本分类-半监督学习-Ladder Networks

Ladder Networks 是一种半监督学习模型&#xff0c;通过将无监督学习与监督学习相结合&#xff0c;在标记数据较少的情况下实现高效的学习。它最初由 A. Rasmus 等人在 2015 年提出&#xff0c;特别适合深度学习任务&#xff0c;如图像分类或自然语言处理。 核心思想 Ladder N…

SQL 基础教程 - SQL SELECT 语句

SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name; 与 SELECT * FROM table_name; 参数说…

fgets TAILQ_INSERT_TAIL

If you’re using the macros from <sys/queue.h> to implement a circular doubly linked list (TAILQ), the inversion issue occurs because you’re using LIST_INSERT_HEAD, which inserts at the head of the list. Instead, to maintain the original order (FIFO…

如何做一份出色的PPT?

要做一份出色的PPT&#xff0c;可以遵循以下步骤和建议&#xff1a; 一、明确目标与主题 确定目标&#xff1a;明确PPT的目的&#xff0c;是为了传达什么信息、解决什么问题或达成什么目标。选定主题&#xff1a;根据目标确定一个清晰、聚焦的主题&#xff0c;这将指导整个演…

Live555、FFmpeg、GStreamer介绍

Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具&#xff0c;它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点&#xff0c;并…

mysql日志(

mysql有以下几种日志&#xff1a; log_error 即错误日志&#xff0c;默认是开启的 log_bin 即redo日志或称二进制日志&#xff0c;运于恢复或复制&#xff0c;默认不开启。 general_log 即通用日志&#xff0c;有时也称查询日志&#xff0c;对所有执行过的语句进行记录&#xf…