优先级队列
#include <iostream> using namespace std; void KeepCharacter(int *data,int n,int num) //保持性质函数,保证是一个大根推; { int left=n*2; int right=n*2+1; int max; //记录最大的数字的位置; if(left<=num&&data[n]<data[left]) //比较根与左孩子大小,挑出一个比较大的数 max=left; else max=n; if(right<=num&&data[max]<data[right]) //比较局部极大值与右孩子,挑出一个最大值 max=right; if(max!=n) { int temp=data[max]; data[max]=data[n]; data[n]=temp; KeepCharacter(data,max,num); //调整后子树有可能不满足性质,应该递归调用; } } void HeapSort(int *data,int tempnum) { int temp=data[tempnum]; data[tempnum]=data[1]; data[1]=temp; tempnum-=1; for(int i=tempnum/2;i>=1;i--) KeepCharacter(data,i,tempnum); } int MaxNum(int *data) //返回堆的最大值 { return data[1]; } void InsertNum(int *data,int key,int num) //向堆中插入元素 { num++; data[num]=key; int parent=num/2; int i=num; while(parent!=0&&data[parent]<data[i]) { int temp=data[i]; data[i]=data[parent]; data[parent]=temp; i=parent; parent/=2; } } int ExtractMax(int *data,int num) //返回并删除堆中最大的元素 { int temp=data[1]; data[1]=data[num]; data[num]=temp; num--; KeepCharacter(data,1,num); return data[num+1]; } void IncreaseKey(int *data,int position,int newvalue) //增大指定位置处的元素键值(注:不可小于原值) { if(data[position]>=newvalue) return; data[position]=newvalue; int parent=position/2; while(parent!=0&&data[parent]<data[position]) { int temp=data[parent]; data[parent]=data[position]; data[position]=temp; position=parent; parent/=2; } } int main() { int num; cout<<"Please input the num of data:"<<endl; cin>>num; cout<<"Please input data:"<<endl; int *data=new int[num+1]; for(int i=1;i<=num;i++) cin>>data[i]; for(int i=num/2;i>=1;i--) //建堆调用 KeepCharacter(data,i,num); cout<<"The max num is : "<<MaxNum(data)<<endl; cout<<"Before Insert:"; for(int i=1;i<=num;i++) cout<<data[i]<<" "; cout<<endl; cout<<"After Insert: "; InsertNum(data,10,num); num++; for(int i=1;i<=num;i++) cout<<data[i]<<" "; cout<<endl<<"After increasekey: "<<endl; IncreaseKey(data,3,8); for(int i=1;i<=num;i++) cout<<data[i]<<" "; cout<<endl<<"After extarctmax: "<<endl; ExtractMax(data,num); num--; for(int i=1;i<=num;i++) cout<<data[i]<<" "; cout<<endl; int tempnum=num; for(int i=num;i>=2;i--) //堆排序过程 { HeapSort(data,tempnum); tempnum--; } cout<<endl<<"After sorted:"<<endl; for(int i=1;i<=num;i++) cout<<data[i]<<" "; cout<<endl; return 0; }