介紹堆排序演算法之前必須知道「堆」這種資料結構,堆可近似看成是乙個完全二叉樹,不同的是用陣列中的元素從上到下,從左到右填充該樹。
堆可分為最大堆和最小堆(檢視定義),堆排序演算法就是建立在最大堆或者最小堆基礎上,通過不斷取出堆頂元素,將剩下n-1個元素重新建堆,如此迴圈獲得有序序列。所以關鍵在於如何建最大堆/最小堆和如何調整剩餘元素為新堆。(不上圖了,大家看其他部落格)
堆排序用在大資料量比較有效,同時不僅用於排序,推廣到取最值的引用中,例如程序排程:選取優先順序最高的程序,時間排程中:取執行時間最短或者等待時間最長等等。
1.堆的儲存
堆一般以陣列的形式表示,i節點的父節點是(i-1)/2,子節點是2*i +1和2*i+2,例如節點0的子節點是1和2。
2.堆的操作
堆操作包括堆的插入(插入堆尾),刪除及刪除後調整(刪除堆頂,重新調整)。堆排序是建堆後取得堆頂元素,所以,重點對刪除及刪除後調整進行操作。
建堆用到遞迴思想,堆的調整是自下往上,把i節點和它的兩個子節點2*i+1和2*i+2進行比較,找出最大的節點存到i節點中,i從樹的最後乙個非葉子節點開始往上取,每一趟便找出最大值,如此往復。
3.實現:(vc6.0驗證通過)
#include//i節點及2*i+1與2*i+2三節點找出最大值,i==start
void adjust(int a,int start,int
len)
else
break;
}}void build(int a,int
len)//從下往上構造最大樹
}void heapsort(int a,int
len)//將數的根節點與尾節點交換後,重新構造樹
}//列印陣列
print(int a,int
len)
void main()
; print(a,8);
heapsort(a,8);
print(a,8);
}
後續總結:堆排序首先建造堆(從下往上),取堆頂元素後,調整堆(從上往下)。建造堆時,從最後乙個非葉子節點開始,與子節點比較,將最大值儲存到i節點中,以此往上,構造出最大堆;將堆頂元素與堆尾元素交換後,對餘下元素(除最大元素)用同樣方法調整,建造新的堆… 排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 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 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...