coding A&D:(選擇排序)堆排序
阿新 • • 發佈:2018-12-11
【概念】:
堆是具有以下性質的完全二叉樹:
每個結點的值都大於或等於其左右孩子結點的值,稱為大根堆;
或者每個結點的值都小於或等於其左右孩子結點的值,稱為小根堆。
(注意:這種結構是對父節點-左/右孩子節點之間做的約束,而對左-右孩子節點之間並沒有什麼要求。千萬別錯記成二叉排序樹的性質)
【排序過程】:(以大根堆為例)
(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