堆排序解析

2021-07-09 18:55:31 字數 1277 閱讀 5592

首先要了解堆的性質,我這裡簡答總結一下(這裡說的是小堆):

1、堆是一棵完全二叉樹

2、對於大堆中的任何乙個非葉子節點,節點的值必須小於左右孩子節點值。

由此可知,對於小堆而言,根節點就是最小值了,那麼我們每次拿走根節點,拿走的順序就是遞增序列的。

排序的元素在陣列中,而堆也是一棵完全二叉樹,所以直接用陣列表示二叉樹。

對於完全二叉樹中的k節點,其滿足一下性質:

1、k節點的父節點為( k - 1 ) / 2

2、k節點的左子節點為2k + 1

3、k節點的右子節點為2k +  2

所以堆排序的步驟如下:

1、填充二叉樹元素,由於我們直接用源資料表示二叉樹,所以這裡不用寫了。

2、由堆的性質可知,任何葉子節點都是滿足堆的性質的,所以找到第乙個非葉子節點的節點,從該節點開始,調整所有節點,讓他們滿足堆的性質

3、移走堆的根節點,得到當前的最大值。

4、將最後乙個節點移至根節點,此時除了根節點外其餘節點都是滿足要求的,重新調整堆,重複第3步。

[cpp]view plain

copy

void

heapadjust(

inta, 

intn, 

intindex)  

//建立的是小根堆

else

}  void

heapsort(

inta, 

intn)  

while

(n > 0)  

}  intmain()  

;  for

( int

i = 0; i 

printf("\n"

);  

heapsort(a, 10);  

printf("\nafter sort:\n"

);  

for( 

inti = 0; i 

printf("\n"

);  

}  

由於建立的是小根堆,所以最後得到是將序列。

最後附乙個堆排的動畫

堆排序演算法解析

堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。11.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字...

深度解析堆排序

堆排序,其實就是用陣列儲存,利用完全二叉樹的性質,對其進行二叉樹的操作,通過構建大頂堆 小頂堆 找到最大值 最小值 與最後乙個節點交換,然後總個數減一,然後重複此操作,最後得到有序序列。如果不理解大頂堆與小頂堆的話,建議先看看 基本思路是 構建出始堆 將堆頂元素與最後乙個節點交換 遞迴此操作。感覺思...

堆排序演算法解析

首先來引入乙個例子 如何使用選擇排序?肯定是每一次遍歷然後把大的放到最後面。當然,前面也可以 我感覺堆排序其實和選擇差不多。堆排序也是每次取出最大值,然後把最大值放後面 但是想學會堆排序,首先要知道什麼是堆 堆的定義 邏輯上 乙個完全二叉樹 物理上 借助向量實現 為什麼能用乙個向量來間接的弄乙個完全...