//优先队列算法
//堆排序是一种非常优秀的算法,但是在实际情况中堆排序的效率却不及快速排序。而作为一种数据结构,堆还有一个比较常用的应用,作为高效的优先队列
// Author's E-mail : steven_zhaosh@163.com Feel free to contact me for comments on my work
#include<iostream>]
#include<vector>
using namespace std;
void exchange(int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
//调整最大堆
void MaxHeapify(vector<int> &a,int pos){
int l = 2 * pos + 1;
int r = 2 * pos + 2;
int largest = pos;
if((l<a.size())&&(a[l]>a[largest])){
largest = l;
}
if((r<a.size())&&(a[r]>a[largest])){
largest = r;
}
if(largest!=pos){
exchange(a[largest], a[pos]);
MaxHeapify(a, largest);
}
}
//创建最大堆
void CreatMaxHeap(vector<int> &a){
int s = a.size() / 2 - 1;
for (int i = s; i >= 0;i--){
MaxHeapify(a, i);
}
}
//返回对首元素,即优先级最大的元素
int HeapMaximum(vector<int> &a){
return a[0];
}
//返回对首元素,并将其出队
int HeapExtractMax(vector<int> &a){
if(a.size()<1){
cout << "heap underflow" << endl;
exit(0);
}
int max = a[0];
a[0] = a[a.size()-1];
a.erase(a.begin()+(a.size()-1)); //删除最后一个元素
MaxHeapify(a, 0);
return max;
}
//把a[pos]的值更新为KEY,保持最大堆,这里的KEY值要大于原来a[pos]
void HeapIncreaseKey(vector<int> &a,int pos,int key){
if(key<a[pos]){
cout << "new key is smaller than current key" << endl;
exit(0);
}
else{
a[pos] = key;
while((pos>=0)&&(a[(pos+1)/2-1]<a[pos])){
exchange(a[pos],a[(pos+1)/2-1]);
pos = (pos + 1) / 2 - 1;
}
}
}
//插入一个元素
void MaxHeapInsert(vector<int> &a,int key){
a.push_back(-1);
HeapIncreaseKey(a, a.size() - 1, key);
}
//输出堆
void printHeap(vector<int> &a){
int c = 2;
for (int i = 0; i < a.size();i++)
{
cout<<a[i]<<" ";
if(c-2==i){
cout << endl;
c=c*2;
}
}
cout << endl;
}
int main(){
int arr[] = {4,1,3,2,16,9,10,14,8,7};
vector<int> array(begin(arr),end(arr)); //用数组初始化vector容器
CreatMaxHeap(array); //创建最大堆
cout<<"the Max Heap is :"<<endl;
printHeap(array); //输出最大堆
cout << HeapMaximum(array) << endl; //返回优先队列中最大元素(对首元素)
cout << "the size of original array is :" << array.size() << endl;
cout << "after HeapExtractMax" << endl;
cout<<"the First Element is : "<<HeapExtractMax(array)<<endl; //返回并把对首元素从队列中删除
cout << "the remaining size is : " << array.size() << endl; //删除后的数组大小
HeapIncreaseKey(array,6,17); //把下标为6的元素值增大到17,并调整堆
cout << "change array[6] to 17 :" << endl;
printHeap(array);
MaxHeapInsert(array, 5); //队尾插入元素,并调整到适当位置
cout << "After insert a new Element 5 :" << endl;
printHeap(array);
system("pause");
return 0;
}