在面試中遇到要你手寫堆排序,可以先詢問是否可以使用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...