有兩個定義:
1.最小堆:所有父結點都比子節點要小
2.最大堆:所有父結點都比子節點要大
//n為結點的總數,h陣列是儲存結點的值
void
siftdown
(int i)
//傳入乙個需要向下調整的結點編號
//如果i不是最小的值,那麼就要進行交換
if(t!=i)
//直到最大的值是自己,才能停止向下調整
else
flag=1;
}return
;}
//向上調整
void
siftup
(int i)
return
;}
for
(i=n/
2;i>=
1;i--
)siftdown
(i);
//建立最大堆
#include
int h[
101]
;//用來存放堆的陣列
int n;
//用來存放堆中元素的個數
//交換函式,用來交換堆中兩個元素的值
void
swap
(int x,
int y)
void
siftdown
(int i)
//如果發現最大的結點編號不是自己,說明子節點中有父節點更大的
if(t!=i)
else
flag=1;
//否則說明當前的父節點已經是最大的,不需要再進行調整了
}return;}
//建立堆的函式
void
creat()
return;}
//堆排序
void
heapsort()
return;}
intmain()
//建堆
creat()
;//堆排序
heapsort()
;//輸出
for(i=
1;i<=num;i++
)printf
("%d "
,h[i]);
return0;
}
堆 優先佇列 堆排序
堆就是在二叉樹上滿足每乙個根節點都大於兩個子節點的資料結構。堆常用來解決兩個問題,堆排序和優先佇列。堆的核心在於如何維護,通過比較來進行遞迴維護。相比於佇列加二分插入的實現,堆可以基於已經有的結果在最長lgn的時間內實現,通常比較到無需換位即可,而二分插入往往都要lgn,define maxn 10...
九 堆和優先佇列 4 堆排序
堆排序 堆排序是一種高效重要的排序方法。它的時間複雜度可以達到o nlogn 原理 首先我們得到乙個大根堆,然後從堆的最後乙個元素開始,依次往前遍歷,每次首先將堆頂元素和當前元素進行交換,交換後再對新的堆頂做乙個自上而下的堆調整。include using namespace std class h...
優先佇列 堆排序
一種支援刪除最大元素和插入元素兩種操作的資料結構叫做優先佇列。實現棧or佇列與實現優先佇列的最大不同在於效能的要求。對於棧和佇列,我們實現能在常數時間完成所有操作 而優先佇列,插入元素和刪除最大元素這兩個操作在最壞情況下需要線性時間完成 優先佇列的各種實現在在最壞情況下執行時間的增長數量級 資料結構...