堆排序演算法 總結

2021-09-08 22:17:37 字數 1394 閱讀 8487

近期面試,老是被問到堆排序演算法。

回答時老是感覺思路不清楚,如今總結一下,把思路弄清楚的。

1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。

好的那麼堆得特性是什麼呢?

堆得定義:

堆是滿足下列性質的數列:

例如以下圖最開始是乙個小頂堆。當把97和13 交換後不是堆了,所以我們要調整根節點使之成為堆即篩選。(注意:是自

堆頂到葉子的篩選過程,應該剛開始是堆因為把堆頂給換了,罪魁禍首是堆頂,其他小範圍還是堆,所以是從堆頂開始)。

這當中還要注意一點。97 與13 交換後應該跟27 比較為什麼呢?

1.由於是小頂堆,所以在97 的子節點裡選擇小者。假設把38放上去。38成了27的父節點比27大就不是小頂堆了。假設換成大頂堆就要比較把大的資料放上去。

所以程式裡交換時要先要比較一下。

程式例如以下:

//堆調整演算法

void heapadjust (heaptype &h, int s, int m)

// 自上而下的篩選過程

if ( jh.r[j+1].key ) ++j;

// 左/右「子樹根」之間先進行相互比較

// 令 j 指示keyword較小記錄的位置

if ( rc.key <= h.r[j].key ) break;

// 再作「根」和「子樹根」之間的比較,

// 若「>=」成立,則說明已找到 rc 的插

// 入位置 s ,不須要繼續往下調整

h.r[s] = h.r[j]; s = j;

// 否則記錄上移,尚需繼續往下調整

h.r[s] = rc; // 將調整前的堆頂記錄插入到 s (注意插入的位置為s j=2*s)

} // heapadjust

2)建堆是乙個從下往上進行「篩選」的過程 (首先要把底部的建成小堆,前面調整是由於僅僅有堆頂,其他都已經是堆了。當我建堆到堆頂是也是從堆頂往下篩選)(

所以說建堆大範圍是從下往上篩選,在加入該結點時,還得從該節點往下篩選確保加入該節點後還是堆

)。例如以下圖建堆過程:  從97 開始->65->38 ->49這是從下往上(大範圍從下往上)。第二個圖到65時又 65與13 調整了(從上往下調整)。當到49時也是49 13   27所以也是從上之下調整(

為了確保增加該結點後還是堆)。

程式例如以下:

堆排序演算法例如以下:

void heapsort ( heaptype &h ) 

} // heapsort

note: 堆排序演算法曾經看過幾遍老是忘,問得時候思路不太清楚。僅僅要把關鍵幾個點弄清楚,把思路搞清楚了以後就不怕了。

演算法總結 堆排序

在軟體設計相關領域,堆 heap 的概念主要涉及到兩個方面 堆排序的時間複雜度是o nlgn 與快速排序達到相同的時間複雜度.但是在實際應用中,我們往往採用快速排序而不是堆排序.這是因為快速排序的乙個好的實現,往往比堆排序具有更好的表現.堆排序的主要用途,是在形成和處理優先順序佇列方面.另外,如果計...

堆排序演算法 總結

最近面試,老是被問到堆排序演算法。回答時老是感覺思路不清楚,現在總結一下,把思路弄清楚的。1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。好的那麼堆得特性是什麼呢?堆得定義 堆是滿足下列性質的數列 如下圖最開始是乙個小頂堆。當把97和13 交換後不是堆了,所以我們要調整根節點使之成為堆即篩...

堆排序演算法 總結

最近面試,老是被問到堆排序演算法。回答時老是感覺思路不清楚,現在總結一下,把思路弄清楚的。1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。好的那麼堆得特性是什麼呢?堆得定義 堆是滿足下列性質的數列 如下圖最開始是乙個小頂堆。當把97和13 交換後不是堆了,所以我們要調整根節點使之成為堆即篩...