數據結構07(Java)-- (堆,大根堆,堆排序)

前言

本文為本小白🤯學習數據結構的筆記,將以算法題為導向,向大家更清晰的介紹數據結構相關知識(算法題都出自🙌B站馬士兵教育——左老師的課程,講的很好,對于想入門刷題的人很有幫助👍)

上面寫完了歸并排序,快速排序,排序它本身整個算法并沒有什么,重要的是他的算法,它怎么提升時間復雜度,以及這種思想的應用,這是我們更要去關注的。下面來看一個新的排序——堆排序。

下面來介紹一下數據結構中的“堆”(Heap)。

1.堆 (Heap) 概述

堆結構就是用數組實現的完全二叉樹結構

  • 堆是一棵完全二叉樹。這意味著除了最后一層,其他層都被完全填滿,且最后一層的節點都盡可能地靠左排列。

  • 堆的數組表示:由于堆是完全二叉樹,可以用數組 heap[0…n-1] 來存儲(通常索引從 0 開始):

    • 根節點:heap[0]
    • 節點 i 的左子節點:heap[2*i + 1]
    • 節點 i 的右子節點:heap[2*i + 2]
    • 節點 i 的父節點:heap[(i-1) / 2] (整數除法)

這種表示法非常節省空間,且父子節點的訪問是 O(1) 的。

        索引: 0 (: 50)/                  \索引: 1 (: 30)     索引: 2 (: 40)/        \           /        \
索引:3    索引:4     索引:5     索引:6
(:20)   (:10)   (:35)   (:25)
數組索引:   0     1     2     3     4     5     6+-----+-----+-----+-----+-----+-----+-----+
數組值:   | 50  | 30  | 40  | 20  | 10  | 35  | 25  |+-----+-----+-----+-----+-----+-----+-----+

2.堆主要有兩種類型:

大根堆 (Max Heap):對于樹中的任意節點,其值大于或等于其子節點的值。因此,根節點(堆頂)是整個堆中最大的元素。

實現大根堆:

package DiGui;public class Dui {public static void heapInsert(int [] arr, int index) {while (arr[index] > arr[(index - 1) / 2]) {swap(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}public static void swap(int [] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
}

大根堆應用: 去掉堆中的最大值,其結構仍保持大根堆

實現思路:
1.找到堆中最大值:肯定是數組中,下標為0的數,這個很簡單。
2.去掉最大值保持大根堆:將數組中下標最大的數,賦值給下標為0位置,在用heapify方法往下調整堆結構。

(heapify方法):

//構建堆,index:構建堆結構下表,一下全是堆結構,heapSize:整個arr數組長度防止越界
public static void heapify(int [] arr. int index, int heapSize){//index 左孩子int left = index * 2 + 1;while (left < heapSize) {//index右孩子,與左孩子比較,取最大值下標int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;//判斷arr[largest] 與 arr[index] 大小取最大值下標largest = arr[largest] > arr[index] ? largest : index;if (largest == index) {break;}swap( arr, largest, index);index = largest;}
}public static void swap(int [] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];

時間復雜度O(logN)

最小堆 (Min Heap):對于樹中的任意節點,其值小于或等于其子節點的值。因此,根節點(堆頂)是整個堆中最小的元素。

堆排序

先來看代碼吧:

package DiGui;public class Dui {public static void heapSort(int [] arr) {if (arr == null || arr.length < 2) {return;}//先把整個數組變成大根堆for (int i = 0; i < arr.length; i++) {heapInsert(arr, i);}//再使整個大根堆有序int heapSize = arr.length;//將數組中最后一個數跟第一個數交換,再heapify,之后一個一個交換,使其完全有序swap(arr, 0, --heapSize);while (heapSize > 0) {heapify(arr, 0, heapSize);swap(arr, 0, --heapSize);}}//public static void heapInsert(int [] arr, int index) {while (arr[index] > arr[(index - 1) / 2]) {swap(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}public static void heapify(int [] arr, int index, int heapSize) {int left = index * 2 + 1;while (left < heapSize) {int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;largest = arr[largest] > arr[index] ? largest : index;if (largest == index) {break;}swap(arr, largest, index);index = largest;}}public static void swap(int [] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
}

其實就是把上面兩個問題結合起來
時間復雜度O(N*logN)

小白啊!!!寫的不好輕噴啊🤯如果覺得寫的不好,點個贊吧🤪(批評是我寫作的動力)

…。。。。。。。。。。。…請添加圖片描述

…。。。。。。。。。。。…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94444.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

onnx入門教程(七)——如何添加 TensorRT 自定義算子

在前面的模型入門系列文章中&#xff0c;我們介紹了部署一個 PyTorch 模型到推理后端&#xff0c;如 ONNXRuntime&#xff0c;這其中可能遇到很多工程性的問題。有些可以通過創建 ONNX 節點來解決&#xff0c;該節點仍然使用后端原生的實現進行推理。而有些無法導出到后端的算法…

YggJS RButton 按鈕組件 v1.0.0 使用教程

&#x1f4cb; 目錄 簡介核心特性快速開始安裝指南基礎使用主題系統高級功能API 參考最佳實踐性能優化故障排除總結 &#x1f680; 簡介 YggJS RButton 是一個專門為 React 應用程序設計的高性能按鈕組件庫。它提供了兩套完整的設計主題&#xff1a;科技風主題和極簡主題&…

Linux(二十)——SELinux 概述與狀態切換

文章目錄前言一、SELinux 概述1.1 SELinux 簡介1.2 SELinux 特點1.2.1 MAC&#xff08;Mandatory Access Control&#xff09;1.2.2 RBAC&#xff08;Role-Based Access Control&#xff09;1.2.3 TE&#xff08;Type Enforcement&#xff09;1.3 SELinux 的執行模式1.4 SELinu…

Linux學習-TCP網絡協議(補充)

一、TCP 頭部標志位 TCP 頭部包含多種標志位&#xff0c;用于控制連接建立、數據傳輸、連接斷開等過程&#xff0c;核心標志位及作用如下&#xff1a;標志位英文全稱作用SYNSynchronize Sequence Numbers請求建立連接&#xff0c;三次握手第一步發送 SYN 包ACKAcknowledgment響…

Go編寫的輕量文件監控器. 可以監控終端上指定文件夾內的變化, 阻止刪除,修改,新增操作. 可以用于AWD比賽或者終端應急響應

工具介紹 0RAYS-AWD-Filechecker一個用Golang編寫的, 輕量級的文件監控器, 會監控指定文件夾內文件刪除, 修改, 新增操作, 然后立刻告警并復原. 一開始是為AWD比賽寫的, 主要是為了防止靶機的web目錄被上馬. 但也可以用到藍隊等場景上. 由于使用的Linux的系統調用, 僅支持Linux…

【6】MySQL 數據庫基礎操作

MySQL 數據庫基礎操作數據庫操作查看數據庫創建數據庫刪除數據庫修改數據庫數據表操作創建表修改表刪除表數據庫操作 查看數據庫 查看有哪些數據庫&#xff1f; 示例&#xff1a; [rootlocalhost][(none)]> show databases; -------------------- | Database |…

Android 探索APP/應用啟動模式、Intent的Flag啟動標志位

寫在前面&#xff1a;Android APP有四種啟動模式——》標準模式(Standard)、棧頂復用模式(SingleTop)、棧內復用模式(SingleTask)、單例模式(SingleInstance)&#xff0c;默認就是標準模式。啟動模式決定了Activity在任務棧內的存在方式&#xff0c;影響了Back返回鍵Activity返…

Y9000P部署開源模型

環境信息&#xff1a; 設備&#xff1a;Y9000P GPU&#xff1a;RTX 3060 6G 系統版本&#xff1a;Ubuntu 24.04 一、下載模型 1、環境準備 1、安裝工具 apt-get -y install git-lfs git lfs install apt-get install python3 python-is-python3 pip3.12 config set global.inde…

大模型入門實戰 | 基于 YOLO 數據集微調 Qwen2.5-VL-3B-Instruct 的目標檢測任務

大模型入門實戰 | 基于 YOLO 數據集微調 Qwen2.5-VL-3B-Instruct 的目標檢測任務這篇就是新手向的“保姆級”實操文。你將把 YOLO 檢測數據 轉成 對話式 Grounding 數據&#xff0c;用 ms-swift 做 LoRA 微調&#xff0c;再用腳本 推理 可視化。 但值得注意的是&#xff0c;一…

基于Python+MySQL實現物聯網引論課程一個火警報警及應急處理系統

物聯網引論課程大作業設計報告一、選題、內容及功能說明我們大作業選擇的是題目三&#xff1a;一個火警報警及應急處理系統。主要需要實現四個功能&#xff1a;感知環境溫度&#xff0c;當環境溫度超過閾值&#xff0c;自動觸發報警&#xff1a;終端 led 以固定頻率閃爍&#x…

基于印染數據的可視化系統設計與實現

標題:基于印染數據的可視化系統設計與實現內容:1.摘要 隨著印染行業的快速發展&#xff0c;印染數據呈現爆發式增長。為了更好地管理和分析這些數據&#xff0c;提高印染生產的效率和質量&#xff0c;本研究旨在設計并實現一個基于印染數據的可視化系統。通過收集印染生產過程中…

實驗1 第一個微信小程序

實驗1 第一個微信小程序一、實驗目標二、實驗步驟1. 自動生成小程序2. 手動創建小程序三、程序運行結果四、問題總結與體會chunk的博客地址一、實驗目標 1、學習使用快速啟動模板創建小程序的方法&#xff1b; 2、學習不使用模板手動創建小程序的方法。 二、實驗步驟 1. 自…

(計算機網絡)JWT三部分及 Signature 作用

JWT&#xff08;JSON Web Token&#xff09;是一種用于 無狀態認證 的輕量級令牌&#xff0c;廣泛用于分布式系統、單頁應用&#xff08;SPA&#xff09;和移動端登錄。JWT 結構概覽JWT 由 三部分組成&#xff0c;用 . 分隔&#xff1a;xxxxx.yyyyy.zzzzz Header&#xff08;頭…

LangGraph

LangGraph 是由 LangChain 團隊開發的開源框架&#xff0c;專為構建??復雜、有狀態、多主體&#xff08;Multi-Agent&#xff09;的 LLM 應用??而設計。它通過??圖結構&#xff08;Graph&#xff09;?? 組織工作流&#xff0c;支持循環邏輯、動態分支、狀態持久化和人工…

STM32物聯網項目---ESP8266微信小程序結合OneNET平臺MQTT實現STM32單片機遠程智能控制---MQTT篇(三)

一、前言本篇文章通過發送AT指令&#xff0c;與云平臺建立通訊&#xff1a;1.創建云平臺2.燒錄AT固件3.MQTT訂閱&#xff08;本篇&#xff09;4.單片機代碼編寫5.微信小程序&#xff08;下載微信開發者工具即可使用&#xff09;二、AT指令集介紹AT指令是一種文本序列&#xff0…

Apache Ozone 2.0.0集群部署

單機部署參考&#xff1a;Apache Ozone 介紹與部署使用(最新版2.0.0)-CSDN博客 安裝部署 官方參考&#xff1a;Documentation for Apache Ozone 準備環境 環境準備參考&#xff1a;Linux環境下Hadoop3.4.0集群部署-CSDN博客 1->4-b 參考&#xff1a;Apache Ozone 介紹與部…

【計算機網絡 | 第9篇】信道的極限容量

文章目錄探秘信道的極限容量&#xff1a;從奈氏準則到香農定理一、信道極限容量的基本概念&#x1f914;二、奈氏準則&#xff1a;無噪聲情況下的碼元速率限制&#x1f426;?&#x1f525;&#xff08;一&#xff09;帶寬與信號傳輸的關系&#xff08;二&#xff09;碼間串擾問…

深入理解Linux iptables防火墻:從核心概念到實戰應用

一、概述&#xff1a;什么是iptables&#xff1f; 在Linux系統中&#xff0c;網絡安全防護的核心工具之一便是iptables。它絕非一個簡單的命令&#xff0c;而是一個功能強大的用戶態工具&#xff0c;與Linux內核中的netfilter框架協同工作&#xff0c;共同構建了Linux的防火墻體…

WebRTC音頻QoS方法一.1(NetEQ之音頻網絡延時DelayManager計算補充)

一、整體簡介 NetEQ計算的網絡延時&#xff0c;直接影響變速算法的決策。在變速算法里面啟動關鍵的作用。 網絡延時計算需要考慮兩種情況&#xff1a; 1、單純抖動的網絡延時計算&#xff0c;在UnderrunOptimizer類中實現&#xff1b; 2、在丟包亂序場景下的網絡延時計算。…

實時操作系統FreeRTOS移植到STM32VGT6

一、前言 下載平臺:STM32F407VGT6 代碼使用平臺:VSCode 編譯器:arm-none-aebi-gcc 程序下載工具:STlink 批處理工具:make 移植的FreeRTOS版本:V11.2.0 其實此方法并不局限在arm-none-aebi-gcc中&#xff0c;此方法對于Keil5也是可以使用的&#xff0c; 只不過復制的一些文件不同…