1、完全二叉樹:若二叉樹的深度為h,則除第h層外,其他層的結點全部達到最大值,且第h層的所有結點都集中在左子樹。
2、滿二叉樹:滿二叉樹是一種特殊的的完全二叉樹,所有層的結點都是最大值。
1、堆是一顆完全二叉樹;
2、堆中的某個結點的值總是大於等於(最大堆)或小於等於(最小堆)其孩子結點的值。
3、堆中每個結點的子樹都是堆樹。
假設原始資料為a=,採用順序儲存對應的完全二叉樹為:
1、構造最大堆
基本思想:首先將每個葉子結點視為乙個堆,再將每個葉子結點於其父節點一起構成乙個包含更多結點的堆。所以在構造堆的時候,首先需要找到最後乙個結點的父節點,從這個節點開始構造最大堆,直到該節點前面的所有分支節點都處理完畢。
注意: 在二叉樹中,若當前節點的下標為 i, 則其父節點的下標為 i/2,其左子節點的下標為 i*2,其右子節點的下標為i*2+1;
2.最大堆中插入節點
最大堆中插入節點,先在堆末尾插入該節點,然後按照堆的初始化過程將該節點放入到合適的位置。
3.最大堆中刪除節點
將最大堆的最後乙個節點放到根節點,然後刪除最大值,然後再把新的根節點放到合適的位置。
堆排序的基本思想是:將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了
再簡單總結下堆排序的基本思路:
a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...
排序演算法之堆排序
堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...
排序演算法之堆排序
宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...