/** 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
len)
}void build_max_heap(int* a, int
len)
void heap_sort(int* a,int
len)
}int heap_max(int*a)
int heap_extract_max(int* a,int&len)
int max = a[1
]; a[
1] =a[len];
len--;
max_heapify(a,
1,len);
return
max;
}void heap_increase_key(int* a, int i, int
key)
a[i] =key;
while(i > 1 && a[i>>1] }void max_heap_insert(int* a,int key,int&len)
void printarray(int *a, int
size)
intmain()
;
//區別len 和 heapsize
//heapsize是堆的大小,而len是初始陣列的總大小。
len = heapsize = 12
;
//首先建堆
build_max_heap(arr, len);
cout
<< "
建堆後:
"
//使用heapmaximum
cout << "
當前最大的元素是:
"
<< heap_max(arr) << endl /使用heapextractmax
cout << "
使用heapextractmax後:
"
printarray(arr, heapsize);
//再次使用heapextractmax
cout << "
再次使用heapextractmax後:
"
printarray(arr, heapsize);
//使用heapincreasekey
cout << "
使用heapincreasekey後:
"
2, 15
); printarray(arr, heapsize);
//使用maxheapinsert
cout << "
使用maxheapinsert後:
"
28, heapsize);
printarray(arr, heapsize);}/*
什麼是最大優先順序佇列
它不是一種普通的先進先出佇列(佇列是什麼?天啊!),它維護的元素有個優先順序屬性,
不管如何進佇列,出列隊的都是優先順序最大的元素!
應用在**
計算機的分時排程啊
最小生成樹的prim演算法
...操作有:
insert(s,x):將元素x插入到集合s
maximum(s):返回s中具有最大關鍵字的元素
extract-max(s):去掉並返回s中的具有最大關鍵字的元素
increase-key(s,x,k):將元素x的關鍵字的值增到k,這裡k值不能小於x的原關鍵字的值
*/
堆排序和優先順序佇列
堆排序和優先順序佇列 堆排序 和合併排序一樣,時間複雜度為o nlgn 同時和插入排序一樣,在原序列中進行 這樣堆排序集合了合併排序和插入排序的優點。堆排序的另乙個特點是利用了 堆 這種資料結構.堆資料結構還不止在堆排序中有用,還可以構成乙個有效的優先佇列.堆 是一種資料結構,也是一種陣列物件,如圖...
堆排序和優先順序佇列priority queue
堆 堆是完全二叉樹,便於用array來儲存堆的所有節點 堆儲存在下標為0開始計數的陣列中,因此在堆中給定下標為i的結點時 如果i 0 結點i是根節點,沒有雙親節點 否則結點i的雙親結點為結點 i 1 2。如果2 i 1 n 1 則結點i無左孩子,否則結點i的左孩子為結點2 i 1。如果2 i 2 n...
堆排序 最大優先佇列
優先佇列支援的操作 insert maximum,extract,increasekey,include include include define number 100 define num 6 using namespace std struct heaptype void exchange ...