1. 程式人生 > >coding A&D:(選擇排序)堆排序

coding A&D:(選擇排序)堆排序

【概念】:

堆是具有以下性質的完全二叉樹: 

   每個結點的值都大於或等於其左右孩子結點的值,稱為大根堆; 

   或者每個結點的值都小於或等於其左右孩子結點的值,稱為小根堆。

(注意:這種結構是對父節點-左/右孩子節點之間做的約束,而對左-右孩子節點之間並沒有什麼要求。千萬別錯記成二叉排序樹的性質)

【排序過程】:(以大根堆為例)

(1)初始化堆:

堆是對父節點-左/右孩子節點之間的約束,所以從最後一個非葉子節點開始調整。
 

(注意每次交換後,都要對下一層的子堆進行遞迴調整,因為交換後有可能破壞已調整子堆的結構。)
(2)進行調整後,堆頂元素(array[0])為最大值,將最大值與堆尾部元素(array[count-1])交換,並將count值減去1,則此時得到新的無序陣列array[count],此時的堆被破壞。

對應到陣列元素為:
 

(黃色標記為已排序部分)

(3)調整堆:與建堆過程類似,堆頂元素被一個比較小的值代替,所以從堆頂元素開始調整,在堆頂、堆頂的左孩子、堆頂的右孩子中找出最大的與堆頂進行交換,被交換的元素再次與他下一層的左右孩子進行比較(遞迴)調整。

(4)重複(2)

過程如下

此時,大概的一個手工過程就懂了,注意的是:初始化堆是基礎,時從下向上調整。交換後調整堆時因為有了建堆的基礎,每次調整的都是二叉樹的一支子樹,是從上往下。


初始狀態: 12 5 9 36 8 21 7

建堆之後: 36 12 21 5 8 9 7

排序之後: 5 7 8 9 12 21 36