閒聊
最近看完乙個電視劇集,豬腳是胃無限和難忘雞。比較奇怪的是整個電視劇集沒有講愛得死去活來的男女之情反而講的是男男之間純純的知己之情(基情),不過別說還挺好看。有種感覺就像:天下人負你又如何,我定然站你這邊...讓我想到了當今社會的一些人,這類人習慣權衡利弊後「戰隊」,或察言觀色後隨波逐流不顧真理事實。這部劇表達的三觀就像一股清流,人生難得一知己,讓我內心頗有觸動。很喜歡胃無限說的一句話:管他熙熙攘攘陽關道,我非要一條獨木橋走到黑。人生難得一知己,能在大家都詆毀不信任甚至敵視你的時候還義無反顧的支援你,那也真是三生有幸了吧。但願看到本篇的朋友們都能找到人生中的知己,即使沒有這個人,也能堅持一些比較正確的原則。比較感同身受的是,那些見不得人的歪門邪道終究是上不了檯面的...
原理
以最大堆為例,利用最大堆結構的特點:每個最大堆的根節點必然是陣列中最大的元素,構建一次最大堆即可獲取陣列中最大的元素。剔除最大元素後,反覆構建餘下數字為最大堆獲取根元素最終保證陣列有序。
以上都是廢話,建議直接看圖
最大堆定義
滿足父節點大於或等於左右子節點即為最大堆,最大堆二叉樹以及對應陣列如上圖。
堆排序流程
1.一趟堆排序
以陣列int n = 為例:
步驟
一、構建最大堆:
從最後乙個非葉子節點(計算公式為n.length/2-1,可自行驗證)開始,從後往前進行調整構建,調整的規則是:若子節點大於父節點,則將子節點中較大的節點元素與父節點交換。
1.調整節點2(陣列索引2),對比子節點9和8,將9和8進行交換;
2.調整節點5(陣列索引1),對比子節點7和3,將7和5進行交換;
3.調整節點6(素組索引0),對比子節點7和9,將6和9進行交換;
二、取出最大堆陣列的第一位根元素與陣列末位元素交換:
2.迴圈構建最大堆
根據上述構建最大堆的原理可以得出堆排序的完整過程
編碼實踐
public class test ;
heapsort(n);
system.out.print("堆排序結果:");
for (int m : n) {
system.out.print(m + " ");
* 堆排序
* @param n 待排序陣列
public static void heapsort(int n) {
for (int i = n.length - 1; i >= 1; i--) {
buildheap(n, i);
swap(n, 0, i);
* @param n 待排序陣列
* @param end 待排序陣列末位下標
public static void buildheap(int n, int end) {
int len = end + 1;
for (int i = len / 2 - 1; i >= 0; i--) {
//堆中i節點對應的左右子節點l和r
int l = 2 * i + 1, r = l + 1;
//指向較大數節點的指標
int p = l;
if (r <= len - 1 && n[l] < n[r]) {
p = r;
if (n[i] < n[p]) {
swap(n, i, p);
* @param n 待排序陣列
* @param i 待交換數字陣列下標
* @param j 待交換數字陣列下標
private static void swap(int n, int i, int j) {
n[i] ^= n[j];
n[j] ^= n[i];
n[i] ^= n[j];
堆排序結果:2 3 5 6 7 8 9
編碼說明一、heapsort堆排序方法
for迴圈(注意迴圈次數比陣列長度小1,原因最低2個數構成最大堆)
i.根據陣列長度構建最大堆;
ii.交換陣列首位(最大堆根節點)與陣列末位;
二、buildheap構建最大堆
1.宣告陣列長度len;
2.for迴圈從最後乙個非葉子結點開始往回遍歷到根節點;
i.找到當前非葉子結點的左右子節點下標;
ii.宣告較大數指標,預設指向左子節點;
iii.對比左右子節點,若右子節點存在且右大於左則指向右子節點;
iv.對比交換較大的子節點和父節點。
結語
本篇以最簡單的**形式講解八大排序之一的堆排序的核心思想和具體實現,堆排序和快速排序均為相對其他排序出現頻率最高的排序演算法。最後,如果覺得本篇對你有所啟發或幫助,不妨關注走一波~
堆排序每一趟的結果 八大排序 堆排序(手寫堆排序)
最近看完乙個電視劇集,豬腳是胃無限和難忘雞。比較奇怪的是整個電視劇集沒有講愛得死去活來的男女之情反而講的是男男之間純純的知己之情 基情 不過別說還挺好看。有種感覺就像 天下人負你又如何,我定然站你這邊.讓我想到了當今社會的一些人,這類人習慣權衡利弊後 戰隊 或察言觀色後隨波逐流不顧真理事實。這部劇表...
八大排序 堆排序
堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...
八大排序演算法(4) 堆排序
是對簡單選擇排序的改進,是一種樹形結構的排序。利用堆的特性,快速選擇出序列中的最大最小元素。堆的定義 用樹表示更加直觀 即 父節點 不大於 不小於 其子節點的完全二叉樹。降序時稱為 大堆頂,公升序時稱為 小堆頂。這樣的堆,其堆頂就是整個序列中最大 最小的元素。不斷的取出堆頂 將剩下序列重組成堆的過程...