記錄一下自己理解的堆和堆排序吧。
堆是一種類似於完全二叉樹的樹形結構,對於二叉樹中所有非葉子節點,如果根節點的值嚴格大於其兩個兒子的值,則稱為
大頂堆,反之稱為小頂堆。
堆排序的一般步驟:
首先利用已有的資料構造乙個堆,大頂堆增序,小頂堆降序。
將堆頂的元素與堆末元素交換,接著重新調整剩下的元素為乙個堆,直到堆末等於堆頂,則堆排序結束。
如何把無序數組建堆。
首先說明乙個下沉調整法。
言下之意就是對於乙個節點,如果其存在值大於此節點值的兒子,就交換他們,並對這個兒子節點再進行調整。
對於乙個長度為n的無序陣列,如果下標從1 ~ n,那麼必定僅有n / 2個結點有子節點。我們從第n / 2個結點開始將其和前面
所有節點進行下沉調整,即得到乙個堆。
大頂堆公升序排序:
1 #include 2using
namespace
std;34
const
int maxn = 100 + 5;5
intval[maxn];67
void swap(int a, int
b) 12
13void sink(int n, int
i) 22}23
24void heap_sort(int
n) 28
for(int i = n; i > 1; i --) 33}
3435
intmain()
41heap_sort(n);
42for(int i = 1; i <= n; i ++)
45 puts(""
);46
return0;
47 }
小頂堆降序排序:
其實就是把sink函式中的大於號變成小於號了而已。
1 #include 2using
namespace
std;34
const
int maxn = 100 + 5;5
intval[maxn];67
void swap(int a, int
b) 12
13void sink(int n, int
i) 22}23
24void heap_sort(int
n) 28
for(int i = n; i > 1; i --) 32}
3334
intmain()
40heap_sort(n);
41for(int i = 1; i <= n; i ++)
44 puts(""
);45
return0;
46 }
堆以及堆排序
二叉 堆 乙個類似完全二叉樹的資料結構 左孩子 2i 右孩子 2i 1 父節點 i 2 以上結論如果記不住,用到時可以自己畫個圖推一下 物理儲存 用陣列儲存a 1,2,3.n 1.調整每個節點的演算法 如果要建立大頂堆,則需遵循每個父親結點的值都要大於左右孩子的值 遞迴版本 param number...
堆以及堆排序實現
1.今天實現了一下堆排序,這裡的堆是指二叉堆,至於二項堆和斐波那契堆以後再說。先看二叉堆的定義 二叉堆是完全二叉樹或近似完全二叉樹。滿足特性是 父親節點的值大於等於 小於等於 左右孩子的值,並且左右子樹也是二叉堆。對應的二叉堆是大頂堆 小頂堆 二叉堆是完全二叉樹,可以用線性表來儲存。2.實現堆排序時...
堆排序詳解 大頂堆
堆的概念 堆是一顆順序儲存的完全二叉樹 每個結點的關鍵字都不大於其孩子結點的關鍵字,這樣的堆稱為小根堆 每個結點的關鍵字都不小於其孩子結點的關鍵字,這樣的堆稱為大根堆 對於n個元素的序列當且僅當下列關係之一的時候,稱之為堆 1 ri r2i 1 且 ri r2i 2 小根堆 2 ri r2i 1 且...