數據結構——堆(介紹,堆的基本操作、堆排序)

我是一個計算機專業研0的學生卡蒙Camel🐫🐫🐫(剛保研)
記錄每天學習過程(主要學習Java、python、人工智能),總結知識點(內容來自:自我總結+網上借鑒)
希望大家能一起發現問題和補充,也歡迎討論👏👏👏

目錄

    • 堆的介紹
    • 堆存儲
    • 堆操作
      • 堆插入
      • 刪除堆頂
        • 自底向上堆化
        • 自頂向下堆化
    • 堆排序
      • 1. 建堆
      • 2. 排序

堆的介紹

堆是一種特殊的樹形數據結構,通常以完全二叉樹的形式表示,并且滿足堆屬性。根據堆屬性的不同,堆可以分為兩種類型:

  • 最大堆(Max Heap):對于每個節點,它的值都大于或等于其子節點的值。因此,堆頂元素(根節點)總是最大的。
  • 最小堆(Min Heap):對于每個節點,它的值都小于或等于其子節點的值。因此,堆頂元素(根節點)總是最小的。

img

堆存儲

img

  • (二叉)堆可以用完全二叉樹的形式進行存儲。
  • 樹中任意節點 i,其左子節點序號為 2*i,右子節點序號為 2*i+1

堆操作

堆插入

  1. 將要插入的元素放到最后
  2. 從底向上,如果父結點比該元素小,則該節點和父結點交換,直到無法交換

img

刪除堆頂

刪除對頂元素是最大堆(最小堆)的最大值(最小值),為了保持堆的性質,需要對堆的結構進行調整,我們將這個過程稱之為"堆化",有兩種方法:

  1. 自底向上的堆化
  2. 自頂向下堆化
自底向上堆化

大頂堆為例:

  1. 先刪除堆頂元素(即數組中index = 1的位置)
  2. 比較根結點的左子節點和右子節點(index = 2和3),較大的元素放到根節點
  3. 此時又有空位,和步驟2一樣,空位兩個子節點較大的移動到空位,直到最底部

img

自頂向下堆化
  1. 我們將最后一個元素移動到堆頂。
  2. 不停與左右子節點的值進行比較,和較大的子節點交換位置,直到無法交換位置。

img

堆排序

堆排序分為兩個步驟:

  1. 建堆
  2. 排序

1. 建堆

建堆需要對所有非葉節點的自頂向下堆化。

順序是從index=n/2index=1依次進行堆化

引用JavaGuide的圖:

  1. 一開始沒排序前的數組(n = 6, 所以要從索引為 3 到 1 的順序進行堆化):

img

  1. index=3的節點進行堆化:

img

  1. index=2的節點進行堆化

img

  1. 對index=1的節點進行堆化,堆化完成

img

2. 排序

我們在第一步已經建堆完畢,故堆頂元素就是最大值。所以我們重復取出堆頂元素,將這個最大的堆頂元素放至數組末尾,并對剩下的元素進行堆化即可。

  1. 取出堆頂元素并且堆化

img

  1. 一次取出堆頂并且優化

imgimgimgimg

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

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

相關文章

c++迷宮問題(migong)

今天的題目叫“迷宮問題(migong&#xff09;”&#xff0c;是“DFS深度優先搜索 遞歸”一類的。 題目描述 設有一個N*N(2<N<10)方格的迷宮&#xff0c;入口和出口分別在左上角和右上角。迷宮格子中 分別放0和1&#xff0c;0表示可通&#xff0c;1表示不能&#xff0c;入…

機器學習-線性回歸(簡單回歸、多元回歸)

這一篇文章&#xff0c;我們主要來理解一下&#xff0c;什么是線性回歸中的簡單回歸和多元回歸&#xff0c;順便掌握一下特征向量的概念。 一、簡單回歸 簡單回歸是線性回歸的一種最基本形式&#xff0c;它用于研究**一個自變量&#xff08;輸入&#xff09;與一個因變量&…

Git知識分享

一、理解git首先要理清楚下面五個概念&#xff1a; 1、工作區(git add 命令之前的樣子) 2、stash 暫存(暫存工作區和暫存區的更改) 3、暫存區(git add 命令之后的存儲區, 4、本地倉庫(git commit提交的位置) 5、遠程倉庫(git push提交的位置) 二、git常用命令&#xff1a; 1、g…

2024年度技術總結——MCU與MEMS和TOF應用實踐

引言 2024年對我來說是技術成長與突破的一年。在這一年里&#xff0c;我不僅在技術領域拓展了深度和廣度&#xff0c;還通過與客戶合作的實際項目&#xff0c;成功實現了從單一MCU到MCU、MEMS與TOF技術融合的跨越。這一過程中&#xff0c;我深刻認識到&#xff0c;技術的進步不…

一句話,我讓 AI 幫我做了個 P 圖網站!

每到過節&#xff0c;不少小伙伴都會給自己的頭像 P 個圖&#xff0c;加點兒裝飾。 比如圣誕節給自己頭上 P 個圣誕帽&#xff0c;國慶節 P 個小紅旗等等。這是一類比較簡單、需求量卻很大的 P 圖場景&#xff0c;也有很多現成的網站和小程序&#xff0c;能幫你快速完成這件事…

如何打造一個高并發系統?

今天和大家聊聊作為一個后端開發&#xff0c;在實際工作中&#xff0c;我們如何打造一個高并發的系統&#xff1f; 如下圖所示&#xff0c;大概有六個層面&#xff0c;我們結合具體的場景直播間簽到去一一細說。 一、前端 1、打散請求&#xff1a;即把用戶的接口分散一點去請求…

996引擎 - 前期準備-配置開發環境

996引擎 - 前期準備 官網搭建服務端、客戶端單機搭建 開發環境配置后端開發環境配置環境 前端開發環境配置環境 后端簡介前端簡介GUILayoutGUIExport 官網 996傳奇引擎官網 所有資料從官網首頁開始&#xff0c;多探索。 文檔&#xff1a; 996M2-服務端Lua 996M2-客戶端Lua 搭…

迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-添加內核編譯

編譯內核時將該 HDF 驅動編譯到鏡像中&#xff0c;接下來編寫驅動編譯腳本 Makefile&#xff0c;代碼如下所示&#xff1a; 加入編譯體系&#xff0c;填加模塊目錄到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多內容可以關注&#xff1a;迅為RK3568開發板篇OpenHa…

生信軟件管家——conda vs pip

pip vs conda&#xff1a; 安裝過python包的人自然兩種管理軟件都用過&#xff0c; Pip install和Conda install在Python環境中用于安裝第三方庫和軟件包&#xff0c;但它們在多個方面存在顯著的區別 總的來說&#xff1a; pip是包管理軟件&#xff0c;conda既是包管理軟件&…

電子電氣工程會議

征稿主題 集中但不限于“電子電氣與信息工程”等其他相關主題。 電子、電氣工程&#xff1a; 電路與電子學、智能芯片、半導體器件、數字信號處理、遙感&#xff0c;雷達和傳感、射頻技術、微電子技術與電子信息、電子工程中的計算智能、電力領域的數據科學技術、智能電力設…

OpenVela 架構剖析:從內核到應用

目錄 一、總體架構概述 二、 內核層 2.1. OpenVela架構的內核基礎 2.2. 內核層的主要職責 2.3. OpenVela對NuttX的擴展與優化 三、系統服務層 2.1. 進程管理 2.2. 內存管理 2.3. 文件系統 2.4. 網絡通信 四、框架層 4.1. 模塊化設計 4.2. API接口 4.3. 組件和服務…

ubuntu 布暑python項目

在Ubuntu上部署Python項目通常包括以下幾個步驟&#xff1a; 1 安裝必要的軟件&#xff1a; 確保系統已經安裝了Python、pip&#xff08;Python包管理工具&#xff09;以及virtualenv&#xff08;可選&#xff0c;用于創建獨立的Python環境&#xff09;。如果還沒有安裝&#…

RV1126畫面質量一:視頻基礎

在聊視頻畫面調節之前&#xff0c;先來認識一下視頻畫面的有一些基礎問題 如今我們所處的時代&#xff0c;是移動互聯網時代&#xff0c;也可以說是 視頻時代 。 從快播到抖音&#xff0c;從“ 三生三世 ” 到 “ 三十而已 ” &#xff0c;我們的生活&#xff0c;被越來越多的 …

準備知識——波紋度和粗糙度區別與聯系

在開始齒輪齒面波紋度開始前&#xff0c;先來學習一下基本概念——波紋度和粗糙度&#xff0c;廢話不多說&#xff0c;直接開始&#xff1a; 什么是表面粗糙度&#xff1f; 表面粗糙度定義為實際表面相對于波谷的較短頻率。如果去觀察加工零件&#xff0c;會注意到它們的表面…

五、華為 RSTP

RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成樹協議&#xff09;是 STP 的優化版本&#xff0c;能實現網絡拓撲的快速收斂。 一、RSTP 原理 快速收斂機制&#xff1a;RSTP 通過引入邊緣端口、P/A&#xff08;Proposal/Agreement&#xff09;機制等&…

寶塔Linux+docker部署nginx出現403 Forbidden

本文主要講述了寶塔docker部署nginx出現403 Forbidden的原因&#xff0c;以及成功部署前端的方法步驟。 目錄 1、問題描述2、問題檢測2.1 檢測監聽端口是否異常2.2 檢測Docker容器是否異常2.2.1 打開寶塔Linux的軟件商店&#xff0c;找到Docker管理器&#xff0c;查看前端容器是…

光交箱啞資源巡檢過程中都要檢查哪些設備,怎樣實現智能化管理

一、光交箱啞資源管理現狀 光交箱啞資源主要包括光纖、光纜、接頭盒、配線架等設備。這些設備在通信網絡中起著至關重要的作用&#xff0c;但由于缺乏智能化的監控和診斷能力&#xff0c;管理難度較大。 效率低下&#xff1a;人工巡檢的頻率和覆蓋范圍有限&#xff0c;資源清…

代碼隨想錄——串

文章目錄 反轉字符串反轉字符串Ⅱ路徑加密反轉字符串中的單詞動態口令字符串匹配重復的子字符串 反轉字符串 344. 反轉字符串 //前后對應交換 //0<->sSize-1 //1<->sSize-2 //... //i<->sSize-1-i,i0,1,...,(sSize-1)/2 void reverseString(char* s, int s…

在K8S中使用Values文件定制不同環境下的應用配置詳解

在Kubernetes&#xff08;簡稱K8s&#xff09;環境中&#xff0c;應用程序的配置管理是一項關鍵任務。為了確保應用程序在不同環境&#xff08;如開發、測試、預發布和生產&#xff09;中都能穩定運行&#xff0c;我們需要為每個環境定制相應的配置。Values文件是在使用Helm管理…

機器學習(5):支持向量機

1 介紹 支持向量機&#xff08;Support Vector Machine&#xff0c;簡稱 SVM&#xff09;是一種監督學習算法&#xff0c;主要用于分類和回歸問題。SVM 的核心思想是找到一個最優的超平面&#xff0c;將不同類別的數據分開。這個超平面不僅要能夠正確分類數據&#xff0c;還要使…