堆排序以及其插入刪除

堆排序

首先介紹一下堆排序屬于選擇排序的一種類型。

其次就是他有點依賴于順序存儲樹判斷其孩子以及父節點的概念,接下來復習一下。

堆分為大根堆和小根堆

① 若滿?:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤ i ≤n/2 )—— ?根堆(?頂堆)
② 若滿?:L(i)≤L(2i)且L(i)≤L(2i+1) (1 ≤ i ≤n/2 )—— ?根堆(?頂堆)

注意這里的判斷條件結合一下前面樹的節點判斷條件來看。

接下來介紹如何進行堆排序,

在大根堆中堆頂元素的關鍵字值最大,

接下里介紹一下給出一堆數組如何建立大根堆,這里一定注意結合樹來理解。

思路:把所有?終端結點都檢查?遍,是否滿??根堆的要求,如果不滿?,則進?調整

在順序存儲的完全?叉樹中,?終端結點編號 i≤?n/2?

簡單來說就是檢查數組的前一半元素(采取從后到前的順序)因為?終端結點編號 i≤?n/2?。檢查這一半的非終端節點是否滿足大根堆的定義看左右孩子是否都比他小

結合這個例子來看,你會發現一般的元素就是從下標4 開始算起,接下來就開始檢查9會發現左子樹大于根所以需要交換位置(包含數組中的位置,可以考慮采用swap來進行元素的交換。),如圖所示

接下來該檢查78了,會發現87比它大。所以需要交換元素。處理完同時掃描下一個元素也就是17。

掃描17發現左右孩子都比它大就需要選取最大的一個了這樣才能滿足大根堆的定義。

處理如下。

接著再處理53

53的處理有點特殊

53交換元素后還是不滿足定義,這時就需要再一次的下墜。

此時得到一個大根堆的樹形

接下來我們看一下代碼的實現以及解析

從上往下看,首先設置i為二分之length同時因為為了方便操作第一個元素也就是數組0元素不存儲數據。然后調用函數

接下來解析函數

首先設置數組0用來臨時存儲根節點,然后借用一個循環注意這里的傳參上一個函數傳過來的i值(也就是用來算非終端節點的i)在本函數中用K來表示了,具體的比較函數的定義

理解了K然后我們繼續看循環,循環體重新設置了一個變量i等于2k用來找到孩子節點,同時注意i要小于數組長度否則沒有意義可能程序還會被臟數據污染。循環條件是可以看為i=i*2

接下來進入循環體,這一步是用來選取子節點里面較大的那個節點,如果大,那么就讓i+1也就是孩子中大的那個的下標。如果沒有就說明時i大那就保持原本的。

如果也就是暫存的元素(此時涉及到的非終端節點)大那就不需要交換位置此時這一棵子樹滿足大根堆的定義就可以直接跳出 循環執行也就是原來的位置處

如果不滿足也就是孩子大那就將孩子調整到K的位置然后修改K值再一次執行此時注意循環條件,再一次檢查調整過后是否還需要下墜才滿足大根堆的條件直到即跳出來數組,此時這個判斷條件說明這個節點已經不能下墜了此時的節點一定是終端節點也就是葉子節點依據

來判斷的,如果是這樣的話也直接執行,即將葉子節點的值設為暫存的元素值,因為它實在太小了,只能不斷地下墜到達葉子節點。具體的看一下接下來53的過程.

?

同時改該函數里面的i值判斷接下來的值是否符合標準。

再一次執行此時溢出數組了,結束循環。?

上面的代碼是建立大根堆,接下里我們介紹基于大根堆實現完整的排序?

?接下來看一下堆排序的完整代碼。?

接下來的才是完整堆排序的思想

堆排序:每?趟將堆頂元素加?有序?序列(與待排序序列中的最后?個元素交換)

并將待排序元素序列再次調整為?根堆(?元素不斷“下墜”)

第一步交換9 和87

然后新的大根堆需要length-1以方便重新排堆(讓87直接輸出到數組末尾同時重新拍大根堆不算87)

調整如下

再一次首元素和末尾元素

然后再一次調整剩下的元素的大根堆同時新大根堆的調整長度需要減1.

再次斷開一個元素,再次調整大根堆剩下操作如此往復即可

n-1趟 處理之后:

接下來我們整合調整過程

注意一下完整邏輯的代碼

這里第一步是建立了一個堆應該是如下圖所示的

此時定義i讓他指向最后一個元素用于交換首尾元素同時要實現上面斷掉元素的過程讓i--,進入循環交換首位元素然后調整大根堆,此時注意一下傳入參數的信息。

調整數組A以下標為1的根堆長度為i-1。再然后循環起來i--再一次交換元素,然后再一次調整,實現之前說過的調整趟數的過程,最后得出升序排序。

堆的插入刪除

首先聲明一下,減輕一下心里負擔的壓力,堆的刪除插入只要求弄懂手算過程沒有代碼,但是要求學會計算對比次數。

這里以小根堆為例演示一下

插入

插入13

注意小根堆規則,根要小于孩子。注意元素的上升,

1.首先對比,32和13發現13小然后就上升13

2.然后對比13和17,發現13需要上升

3.再次對比13和9,發現現在不需要上升了。

此時共發生了三次關鍵字的對比。

接下來插入一下46

發現只需要1次對比它不會上升。

接下來看一下刪除的操作

刪除

被刪除的元素?堆底元素替代,然后讓該
元素不斷“下墜”,直到?法下墜為?

元素被刪除了就會采用堆底的元素來代替。這里刪除13可以選取46來做代替,選取代替元素的規則(要求拆掉元素以后滿足二叉樹的定義所以只能拆掉46),

拆掉46以后還得讓其滿足小根堆的要求先需要對比孩子里面小的值,然后拿孩子里面小的值來和根對比

第一次17和45比較;第二次17和46比較下沉46;第三次52和32比較;第四次比較46和32下沉46

總共對比了4次注意若下方就一個孩子則下墜只涉及到一次對比就沒有孩子間的那次對比了。

接下來刪除65試試

為了符合二叉樹的規則只能借用46

第一次對比78和87,第二次對比78和46,對比結束

接下來總結一下

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

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

相關文章

Spring Boot項目結構解析:構建高效、清晰的代碼框架

在當今的軟件開發領域,Spring Boot因其簡潔性和強大的功能而備受青睞。它不僅簡化了Spring框架的配置,還提供了一套高效的項目開發模式。本文將深入探討Spring Boot項目結構中的關鍵組件,包括PO、Query、VO、Config等,旨在幫助開發…

多客戶端 - 服務器結構-實操

實現2個客戶端之間互相聊天 要求: 1、服務器使用 select 模型實現接受多個客戶端連接,以及轉發消息 2、客戶端要求:使用 poll 模型解決 技能夠 read 讀取服務器發來的消息,又能夠scanf讀取鍵盤輸入的信息 3、客戶端服務器不允許開…

iOS高級開發工程師面試——Objective-C 語言特性

iOS高級開發工程師面試——Objective-C 語言特性 一、多態二、繼承三、代理(Delegate)1. 代理為什么用 weak 修飾呢?block和代理的區別?四、通知(NSNotificationCenter)五、KVC (Key-value Coding)六、屬性七、`@property` [?pr?p?ti]的本質是什么?ivar 、 setter …

MMpretrain 中的 LinearClsHead 結構與優化

LinearClsHead 結構與優化 一、LinearClsHead 核心結構 在 MMPretrain 中,LinearClsHead 是一個簡潔高效的分類頭,其核心結構如下: class LinearClsHead(BaseModule):def __init__(self,num_classes, # 類別數量in_channels, # 輸入…

Spring 學習筆記

1.Spring AOP 怎么實現的AOP 即面向切面編程,是通過代理實現的,主要分為靜態代理和動態代理,靜態代理就是在程序運行前就已經指定并聲明了代理類和增強邏輯,運行時就已經被編譯為字節碼文件了,而動態代理則是在運行過程…

【CVPR2024】計算機視覺|InceptionNeXt:速度與精度齊飛的CNN架構

論文地址:http://arxiv.org/pdf/2303.16900v3 代碼地址:https://github.com/sail-sg/inceptionnext 關注UP CV縫合怪,分享最計算機視覺新即插即用模塊,并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要…

7.15 窗口函數 | 二分 | 位運算 | 字符串dp

lc3316. 字符串dpdp多開一行一列后,注意原字符串下標映射dp[n][m] ( n 是source長度, m 是pattern長度)兩重循環填表for i 1-nfor j 0-m三種狀態轉移1.不選 dp i jdp i-1 j2.不選if tag, dp[i][j]3.if(s ip j) 選,dp i…

Spring原理揭秘--初識AOP

我們知道軟件開發一直在追求高效,易維護,易擴展的特性方式。在面向過程編程到面向對象編程的歷程中,程序的開發有了非常大的進步。但是oop的方式缺依然存在著一些缺點。oop的方式可以將業務進行很好的分解和封裝使其模塊化,但是卻…

Provider模式:軟件架構中的“供應商“設計哲學

文章目錄Provider模式:軟件架構中的“供應商“設計哲學什么是Provider模式?經典應用場景1. 配置管理Provider2. 數據訪問Provider4. 消息隊列ProviderProvider模式的優勢1. 解耦合實際項目中的應用Provider模式的最佳實踐1. 命名約定2. 接口設計原則3. 錯…

LTspic下載,幫助及演示電路

1.下載 LTspice是一款強大高效的免費SPICE仿真器軟件、原理圖采集和波形觀測器,為改善模擬電路的仿真提供增強功能和模型。其原理圖捕獲圖形界面使您能夠探測原理圖并生成仿真結果,這些結果可以通過內置波形查看器進一步觀察分析。 鏈接: …

位置編碼/絕對位置編碼/相對位置編碼/Rope原理+公式詳細推導及代碼實現

文章目錄1. 位置編碼概述1.1 為什么需要位置編碼?2. 絕對位置編碼 (Absolute Position Encoding)2.1 原理2.2 數學公式2.3 代碼實現2.4 代碼與公式的對應關系2.5 特性與優勢2.6 可學習的絕對位置編碼3. 相對位置編碼 (Relative Position Encoding)3.1 原理3.2 數學公…

網絡安全初級第一次作業

一,docker搭建和掛載vpm 1.安裝 Docker apt-get install docker.io docker-compose 2.創建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改寫文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…

交換類排序的C語言實現

交換類排序包括冒泡排序和快速排序兩種。冒泡排序基本介紹冒泡排序是通過重復比較相鄰元素并交換位置實現排序。其核心思想是每一輪遍歷將未排序序列中的最大(或最小)元素"浮動"到正確位置,類似氣泡上升。基本過程是從序列起始位置…

嵌入式 Linux開發環境構建之Source Insight 的安裝和使用

目錄 一、Source Insight 的安裝 二、Source Insight 使用 一、Source Insight 的安裝 這個軟件是代碼編輯和查看軟件,打開開發板光盤軟件,然后右鍵選擇以管理員身份運行這個安裝包。在彈出來的安裝向導里面點擊 next ,如下圖所示。這里選擇…

【字節跳動】數據挖掘面試題0016:解釋AUC的定義,它解決了什么問題,優缺點是什么,并說出工業界如何計算AUC。

文章大綱 AUC(Area Under the Curve)詳解一、定義:AUC是什么?二、解決了什么問題?三、優缺點分析四、工業界大規模計算AUC的方法1. 標準計算(小數據)2. 工業級大規模計算方案3.工業界最佳實踐4.工業界方案選型建議總結:AUC的本質AUC(Area Under the Curve)詳解 一、…

Python后端項目之:我為什么使用pdm+uv

在試用了一段時間的uv和pdm之后,上個月(2025.06)開始,逐步把用了幾年的poetry替換成了pdmuv(pipx install pdm uv && pdm config use_uv true) ## 為什么poetry -> pdm: 1. 通過ssh連接到服務器并使用poetry shell激活虛擬環境之…

鴻蒙Next開發,配置Navigation的Route

1. 通過router_map.json配置文件進行 創建頁面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上創建私有倉庫

一、在 GitHub 上創建私有倉庫打開 GitHub官網 并登錄。點擊右上角的 “” → 選擇 “New repository”。填寫以下內容: Repository name:倉庫名稱,例如 my-private-repo。Description:可選,倉庫描述。Visibility&…

量產技巧之RK3588 Android12默認移除導航欄狀態欄?

本文介紹使用源碼編譯默認去掉導航欄/狀態欄方法,以觸覺智能EVB3588開發板演示,Android12系統,搭載了瑞芯微RK3588芯片,該開發板是核心板加底板設計,音視頻接口、通信接口等各類接口一應俱全,可幫助企業提高產品開發效…

Conda 安裝與配置詳解及常見問題解決

《Conda 安裝與配置詳解及常見問題解決》 安裝 Conda 有兩種主流方式,分別是安裝 Miniconda(輕量級)和 Anaconda(包含常用數據科學包)。下面為你詳細介紹安裝步驟和注意要點。 一、安裝 Miniconda(推薦&a…