【C++单排之路】--优先队列


//优先队列算法
//堆排序是一种非常优秀的算法,但是在实际情况中堆排序的效率却不及快速排序。而作为一种数据结构,堆还有一个比较常用的应用,作为高效的优先队列
// 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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值