堆排序總結

2021-07-13 12:25:14 字數 1099 閱讀 1275

在面試中遇到要你手寫堆排序,可以先詢問是否可以使用stl中建堆的演算法,問清楚面試官的意圖之後方可動手寫**,交流最重要。

heap並不屬於stl元件,是乙個幕後英雄,stl實現了最大堆,預設的元素比較方式是less,如果要使用小根堆,則將比較方式設定為greater,並用來作為priority queue的底層機制。

stl中的堆預設是最大堆,要想用最小堆的話,必須要在push_heap,pop_heap,make_heap等每乙個函式後面加第三個引數greater(),括號不能省略。

heap是一種完全二叉樹,在stl中的實現機制為:由於完全二叉樹整棵樹內沒有任何節點漏洞,所以可以利用array來儲存所有節點。通過array+一組heap演算法即可以實現heap。由於heap需要動態改變大小,比如刪除堆頂的元素,在堆中插入乙個元素等等。所以我們用vector替代array.

stl中heap演算法:

包含標頭檔案:#include

push_heap演算法:入堆操作

pop_heap演算法:出堆操作,即將堆頂元素和二叉樹最後乙個元素交換,並且恢復堆。

sort_heap演算法:進行堆排序

make_heap演算法:使序列變成堆

從頭到尾實現堆排序:

1,建堆

2,遍歷陣列,將堆頂元素與二叉樹最後乙個元素交換,然後進行堆調整操作。

#include #include #include using namespace std;

//從i節點開始調整,n為節點總數 從0開始計算 i節點的子節點為 2*i+1, 2*i+2

void minheapfixdown(vector& vec, int i, int n)

vec[i] = temp;

}//建立堆

void makeminheap(vector& vec)

//堆排序

void heapsort(vector& vec)

}int main();

vectorvec(data,data+9);

makeminheap(vec);

heapsort(vec);

for (int i = 0; i < 9; i++)

cout << vec[i]<

排序總結 堆排序

created by liyuanshuo on 2017 3 17.include heap sort.h 堆的定義 kik 2i k i k 2i 1 若以一維陣列儲存堆,則堆對應乙個完全二叉樹,並且所有的非葉節點的值均不大於 或者不小於 其子女的值 根節點 堆頂元素 的值是最小的 或者最大的 ...

堆排序總結

演算法基於順序儲存的 完全二叉樹 結點i的左孩子是2i 右孩子是2i 1 父節點是i 2 編號小於n 2的結點都是分支結點。大根堆 根 左 右 小根堆 根 左 右 建堆 編號 n 2的所有結點依次 下墜 調整 自底向上處理分支結點 調整規則 小元素逐層 下墜 與關鍵字更大的孩子交換 排序 將棧頂元素...

堆排序總結

堆 孩子節點總是小於 或大於 父節點的完全二叉樹 時間複雜度 o nlogn 步驟 建立堆 從完全二叉樹最後乙個內部節點向前執行堆調整 交換堆首位,堆尺寸 1 對新堆的堆首執行堆調整 重複執行第三步直到堆尺寸為0 初始化資料 var numbers for var i 0 i 20 i consol...