分類: 資料結構
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 交換後不是堆了,所以我們要調整根節點使之成為堆即篩...