九、堆与优先队列---(3)输出堆中元素并获取和删除堆顶元素

来源:互联网 发布:怎么成为算法工程师 编辑:程序博客网 时间:2024/05/01 19:33
/*
*将堆中元素存储在数组里,输出堆中元素也就是输出数组里的元素,并获取和删
*除堆顶元素
*/


#include<iostream>
using namespace std;
class Heap {
private:
    int *data, size;
public:
    Heap(int length_input) {
        data = new int[length_input];
        size = 0;
    }
    ~Heap() {
        delete[] data;
    }
    void push(int value) {
        data[size] = value;
        int current = size;
        int father = (current - 1) / 2;
        while (data[current] > data[father]) {
            swap(data[current], data[father]);
            current = father;
            father = (current - 1) / 2;
        }
        size++;
    }
    //输出堆中元素
    void output() {
        for (int i = 0; i < size; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }
    //获取堆顶元素,即data[0]
    int top() {
        return data[0];
    }
    
    //下滤操作的调整策略:当前元素和左右两个孩子比较大小,如果两个孩子权值较大者,比当前元素权值大,
    //则将该孩子和当前元素进行交换,如果此时仍不满足堆序性,则调用update函数对该孩子继续进行堆调整
    //pos:当前调整位置, n:当前堆中元素个数
    void update(int pos, int n) {
        int lchild = 2 * pos + 1, rchild = 2 * pos + 2;//等于当前元素的左、右孩子位置
        int max_value = pos;
        if (lchild < n && data[lchild] > data[max_value]) {
            max_value = lchild;
        }
        if (rchild < n && data[rchild] > data[max_value]) {
            max_value = rchild;
        }
        if (max_value != pos) {
            swap(data[pos], data[max_value]);
            update(max_value, n);
        }
    }
    
    
    //删除堆顶元素
    //方法:将堆顶元素和对的最后一个元素进行交换, 然后对堆顶元素做一个自上而下的堆调整,即下滤操作。
    void pop() {
        swap(data[0], data[size - 1]);
        size--;
        update(0, size);
    }
    
};
int main() {
    int arr[10] = { 12, 9, 30, 24, 30, 4, 55, 64, 22, 37 };
    Heap heap(100);
    for (int i = 0; i < 10; i++) {
        heap.push(arr[i]);
    }
    heap.output();
    cout << heap.top() << endl;
    heap.pop();
    heap.output();
    return 0;
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月的婴儿上火怎么办 1岁宝宝不吃奶粉怎么办 奶水不够宝宝又不吃奶瓶怎么办 13岁脸上长粉刺怎么办 脸敷面膜过敏了怎么办 婴儿面膜是假的怎么办 一贴面膜就过敏怎么办 一敷面膜就过敏怎么办 敷了面膜后过敏怎么办 脸做面膜过敏了怎么办 二十几年的疤痕怎么办 三星c5听筒坏了怎么办 胖子减肥后皮肤松弛怎么办 小婴儿脸上长癣怎么办 痘痘里面有脓怎么办 牛仔外套买大了怎么办 脸上痘印红红的怎么办 眼罩里的水干了怎么办 面膜水进眼睛里怎么办 面膜用剩的精华怎么办 火山泥面膜边干怎么办 用完撕拉面膜后怎么办 皮肤锁水能力差怎么办 抱枕永久了脏了怎么办 新买的棉被掉毛怎么办 羊毛被总是窜毛怎么办 骆毛被子掉毛怎么办 太阳晒伤皮肤痒怎么办 皮肤被太阳晒伤怎么办 晒伤皮肤有斑怎么办 晒伤的皮肤变痒怎么办 晒了太阳脸发红怎么办 新棉被没太阳晒怎么办 白掌的叶子发黄怎么办 栀子花长得太高怎么办 新羊毛被有味道怎么办 新买的衣服掉毛怎么办 羊毛被用水洗了怎么办 羊毛被一股骚味怎么办 水管被水垢堵了怎么办 花洒喷头堵了怎么办