堆指的是每一個節點的值大於等於或小於等於左右節點的值的徹底二叉樹結構,堆又分大頂堆(每一個節點的值大於等於左右節點的值)和小頂堆(每一個節點的值小於等於左右節點的值)。數組
使用堆進行排序的前提是要先構造一個堆出來,這裏以大頂堆爲例。blog
給定一個數組進行構造大頂堆。排序
構造大頂堆的主要思路:二叉樹
一、n個數據;im
二、從待處理的數據裏取出一個數據,插入到堆的尾部,並調整成大頂堆;數據
2.一、若是調整的節點值比其父節點值大,那麼兩個節點交換值,重複該步驟,直到調整的節點是根節點;db
2.二、不然插入節點後就是大頂堆,無需調整;img
三、重複步驟2直到全部數據已取出。co
構造堆的代碼實現:ps
堆也構建完了,那麼剩下就是該怎麼排序了,排序的思路是:
一、有n個元素的大根堆;
二、用根節點和當前堆的最後一個節點進行交換;
三、將剩下的n-1個元素再調整成大頂堆(調整大頂堆思路參照構造大頂堆的思路);
四、重複步驟二、步驟3,直到完成排序。
代碼實現:
獲得的數組,逆序輸出就是排序後的數組了。
關注公衆號 吃菜長肉