資料結構 堆與堆排序

2021-08-26 14:59:41 字數 2445 閱讀 1422

堆其實是從完全二叉樹演變過來的並且用來儲存資料的,什麼是完全二叉樹呢?完全二叉樹就是:

若設二叉樹的深度為h,除第h層外,其它各層(1h-1)的結點數都達到最大個數,第h層所有的結點都連續集中

在最左邊,這就是完全二叉樹。我們知道二叉樹可以用陣列模擬,堆自然也可以。

現在讓我們來畫一棵完全二叉樹:

從圖中可以看出,元素的父親節點陣列下標是本身的1/2(只取整數部分),所以我們很容易去模擬,也很容易證明其所有操作都為log級別~~

堆還分為兩種型別:大根堆小根堆

顧名思義,就是保證根節點是所有資料中最大/小,並且盡力讓小的節點在上方不過有一點需要注意:堆內的元素並不一定陣列下標順序來排序的!!下標為1就是第一大/小,2是第二大/小……

堆的幾個基本操作:

首先堆的上浮過程,

以小根堆為列:說直白一點就是從當前節點與他的父節點進行比較,小於則交換,並且將當前節點的下標更換為它父節點的下標,否則退出。

堆的下浮過程:如果它有子節點,將當前節點與他的左右子節點的最小值進行比較,如果相等則進行交換,並且將當前節點的下標與更換為交換值的子節點的下標。否則退出。

插入操作:每次插入都是從最後乙個節點進行插入,並且比較上浮到它自己應有的位置去

彈出操作:彈出操作就是將根節點的元素彈出,這裡有乙個技巧就是將根元素與尾元素進行交換然後將新的根元素下沉就行了。

什麼是堆排序?

堆排序:運用堆的性質,我們可以得到一種常用的、穩定的、高效的排序演算法————堆排序。堆排序的時間複雜度為o(n*log(n)),空間複雜度為o(1),堆排序的思想是: 

對於含有n個元素的無序陣列nums, 構建乙個堆(這裡是小頂堆)heap,然後執行取頂 top得到最小的元素,這樣執行n次得到序列就是排序好的序列。 

如果是降序排列則是小頂堆;否則利用大頂堆。

注意到堆的刪除操作,如果是刪除堆的根節點,則不用考慮執行上浮的操作;若刪除的是堆的非根節點,則要視情況決定是pop還是上浮操作,兩個操作是互斥的。

上浮 shift_up;下沉 shift_down插入 push彈出 pop取頂 top堆排序 heap_sort

case 1 :

刪除中間節點i21,將最後乙個節點複製過來;

由於沒有進行下沉操作,節點i的值仍然為6,因此為確保堆的性質,執行上浮操作;

刪除中間節點i,將值為11的節點複製過來,執行下沉操作; 

由於執行下沉操作後,節點i的值不再是11,因此就不用再執行上浮操作了,因為堆的性質在下沉操作生效後已經得到了保持。

堆資料結構與堆排序

堆資料結構 堆 二叉堆 是近似的完全二叉樹,最底層允許不滿,堆的相關,陣列長度length,heap size有效長度 堆的有效元素,未排序的數目 heap size堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解 堆的儲存結構 從上往下,...

資料結構系列 堆與堆排序

堆是一種特殊的樹結構,通常將按照一定順序排列好的樹結構稱之為堆。堆是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆 斐波那契堆等。堆的定義如下 n個元素的序列當且僅...

堆(資料結構)及堆排序

這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...