堆以及堆排序詳解

2022-05-20 20:55:16 字數 1388 閱讀 6732

記錄一下自己理解的堆和堆排序吧。

堆是一種類似於完全二叉樹的樹形結構,對於二叉樹中所有非葉子節點,如果根節點的值嚴格大於其兩個兒子的值,則稱為

大頂堆,反之稱為小頂堆。

堆排序的一般步驟:

首先利用已有的資料構造乙個堆,大頂堆增序,小頂堆降序。

將堆頂的元素與堆末元素交換,接著重新調整剩下的元素為乙個堆,直到堆末等於堆頂,則堆排序結束。

如何把無序數組建堆。

首先說明乙個下沉調整法。

言下之意就是對於乙個節點,如果其存在值大於此節點值的兒子,就交換他們,並對這個兒子節點再進行調整。

對於乙個長度為n的無序陣列,如果下標從1 ~ n,那麼必定僅有n / 2個結點有子節點。我們從第n / 2個結點開始將其和前面

所有節點進行下沉調整,即得到乙個堆。

大頂堆公升序排序:

1 #include 2

using

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 2

using

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 且...