heap实现的最大优先队列
2012-03-05 15:18
645 查看
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; #define LEFT(i) 2*(i) #define RIGHT(i) 2*(i)+1 #define PARENT(i) (i)/2 int size = 15; void h_swap(int &a,int &b) { int t=a; a=b; b=t; } void max_heapfy(int a[],int i) { int max; int l; int r; l=LEFT(i); r=RIGHT(i); if(l<=size&&a[l]>a[i]){ max=l; } else{ max=i; } if(r<=size&&a[r]>a[max]){ max = r; } if(max!=i) { h_swap(a[max],a[i]); max_heapfy(a,max); } } void BuildHeap(int a[]) { for(int i=size/2;i>=1;i--) { max_heapfy(a,i); } } void print(int a[],int n) { int i=1; while(i<=n) { cout<<a[i]<<" "; i++; } cout<<endl; } int Heap_max(int a[]) { return a[1]; } int Heap_extract_max(int a[]) { if(size<1){ cout<<"heap is NULL"<<endl; exit(-1); } int max; max=a[1]; h_swap(a[1],a[size]); size--; max_heapfy(a,1); return max; } void heap_increase_key(int a[],int i,int key) { if(key<a[i]){ cout<<"key is smaller than a[i]"<<endl; exit(-1); } a[i] = key; while(i>1&&PARENT(i)<a[i]) { h_swap(a[i],a[PARENT(i)]); i=PARENT(i); } } void max_heap_insert(int a[],int key) { size=size+1; a[size] = 0xffffffff; heap_increase_key(a,size,key); } int main() { int a[101]; srand(time(0)); for(int i=1;i<=size;i++) { a[i]=rand()%100*size; } BuildHeap(a); print(a,size); cout<<Heap_extract_max(a)<<endl; print(a,size-1); heap_increase_key(a,10,100000); print(a,size); max_heap_insert(a,100); print(a,size); return 0; }
相关文章推荐
- min heap priority queue 最小堆实现的优先队列
- 用最大堆实现优先队列(c++)
- 算法笔记(堆实现的最大优先队列)
- [C++ 实现最大值优先队列和最小值优先队列]
- 数据结构实现之最大索引优先队列
- 用最大堆实现优先队列
- 算法入门--最大堆实现优先队列
- Python实现最大优先队列
- 优先队列的Java实现(最大二叉堆)
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 最大堆及优先队列的实现
- 基于最大堆的最大优先队列的实现(C语言)
- 二叉堆(binary heap)—— 优先队列的实现
- DataStructure之最大优先队列的java实现
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- 堆数据结构+堆排序+最大优先队列的堆的实现
- 算法笔记(堆实现的最大优先队列)
- 数据结构_使用二叉堆实现优先队列
- 优先队列(C++实现)
- 使用vector实现优先队列