/* * Author: BigBallon * Note: Max_priority_queue * Date: 2013.11.21 */
一篇好文章:http://blog.csdn.net/xihuanqiqi/article/details/7098909 #include<iostream> using namespace std; void My_swap(int& x, int& y) { int t = x; x = y; y = t; } void Max_Heapify(int* A, int i, int len) { int lt = i<<1; int rt = (i<<1)+1; int largest = 0; if(lt <= len && A[lt] > A[i]) largest = lt; else largest = i; if(rt <= len && A[rt] > A[largest]) largest = rt; if(largest != i) { My_swap(A[i],A[largest]); Max_Heapify(A,largest,len); } } void Build_Max_Heap(int* A, int len) { for(int i = len/2;i>=1;i--) Max_Heapify(A,i,len); } void Heap_Sort(int* A,int len) { Build_Max_Heap(A,len); int size = len; for( ; size>=2; ) { My_swap(A[1],A[size]); size--; Max_Heapify(A,1,size); } } int Heap_Max(int* A) { return A[1]; } int Heap_Extract_Max(int* A,int& len) { if(len < 1) { cout<<"Heap underflow"<<endl; } 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) { if(key < A[i]) { cout<<"new key is smaller than current key."<<endl; } A[i] = key; while(i > 1 && A[i>>1] < A[i]) { My_swap(A[i],A[i>>1]); i >>= 1; } } void Max_Heap_Insert(int* A,int key,int& len) { len+=1; A[len] = 0xf0000000; Heap_Increase_Key(A,len,key);//A,len,key,注意参数 } void PrintArray(int *A, int size) { for (int i=1; i<=size; ++i) cout<<A[i]<<ends; cout<<endl; } int main() { //数组下标从1开始. int len, heapsize; int arr[100] = {0, 15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1}; // 区别len 和 heapsize // heapsize是堆的大小,而len是初始数组的总大小。 len = heapsize = 12; // 首先建堆 Build_Max_Heap(arr, len); cout << "建堆后: " << endl; PrintArray(arr, len); // 使用HeapMaximum cout << "当前最大的元素是: " << endl; cout << Heap_Max(arr) << endl << endl; // 使用HeapExtractMax cout << "使用HeapExtractMax后: " << endl; Heap_Extract_Max(arr,heapsize); PrintArray(arr, heapsize); // 再次使用HeapExtractMax cout << "再次使用HeapExtractMax后: " << endl; Heap_Extract_Max(arr,heapsize); PrintArray(arr, heapsize); // 使用HeapIncreaseKey cout << "使用HeapIncreaseKey后: " << endl; Heap_Increase_Key(arr, 2, 15); PrintArray(arr, heapsize); // 使用MaxHeapInsert cout << "使用MaxHeapInsert后: " << endl; Max_Heap_Insert(arr, 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的原关键字的值 */