堆排序演算法 總結

2021-06-22 08:56:24 字數 1581 閱讀 6632

分類: 資料結構

it 面試

2011-09-22 11:39

10991人閱讀收藏 

舉報演算法面試

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

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

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

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

堆得定義:

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

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

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

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

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

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

程式如下:

[cpp]view plain

copy

//堆調整演算法

void

heapadjust (heaptype &h, 

ints, 

intm)  

// 自上而下的篩選過程

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

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

// 令 j 指示關鍵字較小記錄的位置

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所以也是從上之下調整(

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

程式如下:

堆排序演算法如下:

[cpp]view plain

copy

void

heapsort ( heaptype &h )   

} // heapsort

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

演算法總結 堆排序

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

堆排序演算法 總結

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

堆排序演算法 總結

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