排序演算法串燒——堆排序
阿新 • • 發佈:2018-12-09
堆排序準備知識講解
什麼是堆:
堆是一種具有特定特性的完全二叉樹。
滿足兩種特定的性質:
1. 堆的每一個父親節點都大於(或小於)其子節點(分別稱為:大頂堆、小頂堆)。
堆排序的建立過程:
我們使用一組資料來進行堆排序,以直觀的理解堆排序的過程。我們實現的是大頂堆。
使用資料: 33, 25, 47,58,22, 17, 99 將其升序排列。
第一步:建堆(升序建小堆,降序建大堆)。首先,將資料直接按順序填充到完全二叉樹中,此時尚未形成堆。然後,從最後一個非葉子節點開始進行調整(根據堆的定義,是考慮父節點大於或者小於子節點,因此,我們總是考慮非葉子節點即父節點),因此我們首先考慮3號節點,其數值為47,而後觀察以其為父節點的左右子節點,將三者中最大值放到父節點位置。
繼續遍歷剩下的非葉子節點,從後往前, 因此接下來將選擇2號節點,與其左右節點相比較,如果子節點大於父親節點,則交換位置。再接下來就是1號節點,示意圖如下。
第二步:堆建立好之後,進行排序。排序過程:使用第一個節點和第N個節點交換資料,並且將最後一個節點脫離出堆,最為有序資料,剩下的N-1個節點通過調整再次形成堆。繼續使用第一個節點和無序的最後一個節點,即N-1個節點,交換,再進行調整。一直迴圈執行到所有節點均有序,排序完成。示意圖如下: