堆
堆是完全二叉樹,便於用array來儲存堆的所有節點;堆儲存在下標為0開始計數的陣列中,因此在堆中給定下標為i的結點時:
① 如果i=0: 結點i是根節點,沒有雙親節點;否則結點i的雙親結點為結點(i-1)/2。
② 如果2*i+1>n-1: 則結點i無左孩子,否則結點i的左孩子為結點2*i+1。
③ 如果2*i+2>n-1: 則結點i無右孩子,否則結點i的右孩子為結點2*i+2。
大根堆與小根堆priority_queue
根據元素排列方式,heap可分為max-heap和min-heap兩種,前者每個節點的鍵值(key)都大於或等於其子節點鍵值,後者的每個節點鍵值(key)都小於或等於其子節點鍵值。因此,max-heap的最大值在根節點,並總是處於底層array或vector的頭部。min-heap的最小值在根節點,總是位於底層array或vector的起頭處。
堆排序
小根堆實現降序排列,大根堆實現公升序排列。
小根堆實現堆排序(降序)基本思想:
(1) 初始化堆:將數列a[0,...,n-1]構成小根堆;
(2) 交換資料:將a[0]與a[n-1]交換,使a[n-1]成為a[0,...,n-1]中的最小值;然後將a[0,...,n-2]重新調為小根堆。然後,將a[0]與a[n-2]交換,使a[n-2]成為a[0,...,n-2]中的最小值;然後將a[0,...,n-3]重新調為小根堆。依次類對,直到整個數列a[0,...,n-1]有序(降序)。
**如下:
(1) 遞迴調整下沉
// 遞迴調整下沉
void minheapadjust(int *arr, int i, int size) // i為父節點索引 }}
// 建堆
void buildminheap(int *arr, int size)
}// 堆排
void minheapsort(int *arr, int size)
}
(2) 迭代調整下沉
// 迭代調整下沉
void adjustdown(int *arr, int i, int size)
else
break; // 父節點本身是min(父,左,右)時,跳出迴圈; }}
// 建立小根堆
void buildminheap(int *arr, int size)
// 堆排降序
void minheapsort(int *arr, int size)
}
優先順序佇列priority_queuepriority_queue本質是乙個堆。1. 標頭檔案是#include2. 關於priority_queue中元素的比較模板申明帶3個引數:priority_queue,其中type 為資料型別,container為儲存資料的容器,functional 為元素比較方式。
container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector。
比較方式預設用operator特別注意pair的比較函式:先按照pair的first元素降序,first元素相等時,再按照second元素降序。
如果要用到小頂堆,則一般要把模板的3個引數都帶進去。stl裡面定義了乙個仿函式greater<>,基本型別可以用這個仿函式宣告小頂堆。如: priority_queue, greater> q;
堆排序和優先順序佇列
堆排序和優先順序佇列 堆排序 和合併排序一樣,時間複雜度為o nlgn 同時和插入排序一樣,在原序列中進行 這樣堆排序集合了合併排序和插入排序的優點。堆排序的另乙個特點是利用了 堆 這種資料結構.堆資料結構還不止在堆排序中有用,還可以構成乙個有效的優先佇列.堆 是一種資料結構,也是一種陣列物件,如圖...
堆排序 最大優先順序佇列
author bigballon note max priority queue date 2013.11.21 一篇好文章 include using namespace std void my swap int x,int y void max heapify int a,int i,int l...
二叉堆 堆排序 優先順序佇列
二 堆排序 三 優先順序佇列 四 參考資料 堆排序 用 來實現優先順序佇列 二叉堆本質上是一棵完全二叉樹,分為最大堆和最小堆兩種 二叉堆的根節點叫做堆頂。二叉堆本質雖然是完全二叉樹,但是底層沒有使用鍊錶 鏈式儲存 實現,而是使用陣列 順序儲存 實現。根據二叉樹的性質,假設父節點的索引為i,則左孩子所...