演算法複習(1) 堆排序

2021-06-30 16:50:46 字數 1392 閱讀 5757

堆是一種完全二叉樹結構,以陣列儲存

堆的最後一層從左開始填充

對於元素個數為n的堆來說,高度為 floor(lgn)

對於給定下標i (從0開始),父節點,左兒子,右兒子分別為:

parent(i)

return (i-1)>>1

left(i)

return

2i+1

right(i)

return

2i+2

堆排序主體為3個函式:

heapify、buildheap、sort

heapify用來保持某個特定節點及其所有子節點的最大/最小堆性質

buildheap用來將整個陣列構建為最大/最小堆

sort將陣列排序,並毀壞最大/最小堆結構

//以最大堆為例

//這裡不做邊界檢查

void heapify(int * arr, int

index, size)

}void buildheap(int* arr, int size)

void sort(int* arr, int size)

}

三個函式中關鍵在於buildheap是從最後乙個擁有子節點的節點開始從下向上整理,而排序時每次都能以o(1)的代價找出最大值,再以o(lgn)代價恢復最大堆。

以最大/最小堆實現的最大/最小優先順序佇列是最大/最小堆的乙個重要應用。

以最大堆為例

在之前的基礎上新增了maximum, extractmax, increasekey(最小堆相應的為decreasekey), insert 四個函式

int maximum(int* arr)

int extractmax(int* arr, int

size)

bool increasekey(int* arr, int index, int

size, int key)

return true;

}//**不檢查邊界,但是在這裡邊界檢查非常重要

bool insert(int* arr, int

size, int key)

最大/最小優先順序佇列在例如事件迴圈,工作排程中有顯著的應用價值

但是對於最大/最小優先順序佇列,有乙個問題:為什麼在演算法導論的介紹中不提供decreasekey(最大堆)和increasekey(最小堆)?

就資料結構來說是完全可以做到的,代價也只是一次heapify所帶來的o(lgn)。我估計只是與最大/最小優先順序佇列的設計相違背所以不提供。實際工程應用中可能會有各種各樣的需求,應當視實際情況重新設計。

若有不對,歡迎指出。

演算法導論複習(3) 堆排序

堆排序與歸併排序具有相同的時間複雜度o nlgn 但是在講堆排序之前,先要搞清楚堆排序使用的 二叉堆 二叉堆是乙個陣列,可以被看成近似的完全二叉樹 特點 1.樹上每一節點對應乙個元素,除最底層外,樹是完全充滿的,而且從左到右填充。2.a 大頂堆 根節點的值是大於等於任何子節點的值 b 小頂堆 根節點...

演算法 堆排序(堆)

使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...

演算法複習1 堆

insert 函式有以下三種用法 1 在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器 2 在指定位置loc前插入num個值為val的元素 3 在指定位置loc前插入區間 start,end 的所有元素 1 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中...