zoukankan      html  css  js  c++  java
  • 最大堆/最小堆/优先队列 实现代码(c++)

    自我感觉代码写的比较乱,这方面要好好注意一下。

    总结:

    1.在使用vector<int>::size_type 类似的类型时,千万要注意循环的条件判断,很容易发生溢出的危险!所以我最后很懒的选择使用int  - -。

    2.下标表示和元素个数表示之间的细微差别。下标之间的变换关系:

       父节点 parent(i)=(i-1)/2; 左孩子 left(i)=2*i+1;右孩子 right(i)=2*i+2

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    class Max_Heap{
        typedef int index;
    public:
        Max_Heap(vector<int> &vec) :v(vec){
            Build_Heapify();
        }
        ~Max_Heap(){};
        void Heap_Sort();
        int Heap_Max() { return v[0]; }
        int Heap_Extract_Max();
        void Insert(int key);
    private:
        vector<int> &v;
        void Max_Heapify(index i, int hs);
        void Build_Heapify();
    };
    
    void
    Max_Heap::Max_Heapify(index i, int hs){
        int l = 2 * i + 1, r = 2 * i + 2;
        int largest = i;
        if (l < hs&&v[l] > v[i])
            largest = l;
        if (r < hs&&v[r] > v[largest])
            largest = r;
        if (largest != i){
            swap(v[i], v[largest]);
            Max_Heapify(largest, hs);
        }
    }
    
    void
    Max_Heap::Build_Heapify(){
        int hs = v.size();
        for (int i = (hs / 2) - 1; i >= 0; --i)
            Max_Heapify(i, hs);
    }
    
    void
    Max_Heap::Heap_Sort(){
        int hs = v.size();
        Build_Heapify();
        for (int i = hs - 1; i >= 0; --i){
            swap(v[0], v[i]);
            Max_Heapify(0, i);
        }
    }
    int
    Max_Heap::Heap_Extract_Max() {
        if (v.size() == 0)
        {
            std::cout << "over flow";
            return 0;
        }
        else {
            int temp = v[0];
            swap(v[0], v[v.size() - 1]);
            v.pop_back();
            Max_Heapify(0, v.size());
            return temp;
        }
    }
    void
    Max_Heap::Insert(int key){
        v.push_back(key);
        int sz = v.size();
        while (sz >= 2 && key > v[sz / 2 - 1]){
            swap(v[sz - 1], v[sz / 2 - 1]);
            sz = sz / 2;
        }
    }
  • 相关阅读:
    《Vue.js 2.x实践指南》 已出版
    《H5+移动应用实战开发》已出版
    关于《ASP.NET MVC企业级实战》
    ASP.NET MVC企业级实战目录
    ASP.NET MVC4入门到精通系列目录汇总
    网站服务架构
    ASP.NET MVC搭建项目后台UI框架—1、后台主框架
    webpack介绍—上
    通过一个vue+elementUI的小实例来讲解一下它们是如何使用的
    不要为自己学历低找借口
  • 原文地址:https://www.cnblogs.com/Nastukashii/p/4394307.html
Copyright © 2011-2022 走看看