精讀「聖經」 堆與堆排序

2021-08-14 20:16:40 字數 786 閱讀 5352

這一篇主要講解堆的定義,堆排序的實現。

我們熟知的堆,應該是記憶體中的「堆」,堆和棧是我們熟知的記憶體結構之一,通常,在乙個函式中所執行的變數都是儲存在棧幀中,可以說棧是系統自己開闢出來的。

而堆則是需要我們自己來進行分配(每個語言的分配語法都不盡相同,但都大同小異,我就不過多闡述了)。

但是這一篇,我們不講這個「堆」,而是資料結構上的堆。

堆,又稱是二叉堆,在資料結構上其實就是一種陣列物件,因此二叉堆可以完全被視為一棵二叉樹。而根據二叉樹的定義,其父子結點,左右孩子結點的表示(c語言為例):

int parent(int i)return i/2;

int left(int i)return 2*i;

int right(int i)return 2*i+1;

由此定義可以訪問任意結點。

最大堆:最大堆是指某個結點的值至多適合其父結點的值一樣大。(最小堆的定義相類似)

利用最大堆的性質,我們可以對任意堆進行堆進行下降操作:

void max_heapify(int a,int i,int n)

return;

}由此函式使一般的堆轉變為最大堆。

利用最大堆,我們可以對堆進行排序。排序的方法:利用最大堆的第乙個結點(根結點)是所有結點中最大的性質,將第乙個元素與最後乙個元素交換,並將原來的n個元素縮減為n-1個元素,再進行「下降」操作,迴圈到只剩最後一項,完成排序。、

注意事項:進行迴圈的條件必須從最小的父結點開始(根結點是最大的根結點),想想為什麼不能先從根結點開始。

void build(int a)

堆與堆排序

二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時...

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。堆排序是就地排序,輔助空間為o 1 它是不穩定的排序方法。排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前 和排序後他們的相對位置不發生變化 先說說什麼是堆,堆通常是乙個可以被看做一棵樹的陣列物...

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...