小顶堆的实现:插入insert和删除pop(C++)

#include <iostream>
#include <vector>
using namespace std;

class litterheap{  //小顶堆
//private:

public:
    vector<int> heap;//堆的底层:数组
//小顶堆插入一个数:先将要插入的数存放在堆的最后(即容器的末尾,下标为index),
// 再与其父节点(下标为(index-1)/2)的值进行比较,如果小于父节点的值,则交换两者的位置,
//直到循环结束;否则,位置不变,退出循环。
    void insert(int val){
        heap.push_back(val);
        int index=heap.size()-1;
        int father=(index-1)/2;
        while(index>0){
            if(heap[index]<heap[father]){
                swap(heap[index],heap[father]);
                index=father;
                father=(index-1)/2;
            }
            else{
                break;
            }
        }
    }

    void swap(int &val1,int &val2){
        int temp=val1;
        val1=val2;
        val2=temp;
    }
//小顶堆的删除操作:堆只能删除顶部元素。
//首先删除小顶堆的顶部元素,然后将小顶堆的最后一个元素放在顶部,再依次与它小的孩子节点的值进行比较,
//如果大于小的孩子节点的值,则与这个小的孩子节点交换位置,如此直到循环结束;
//否则,位置不变,退出循环
    void pop(){
        heap[0]=heap.back();
        heap.pop_back();
        int index=0;
        int max_index=heap.size()-1;
        int lchild;
        int rchild;
        while(index<max_index){
            lchild=index*2+1;
            rchild=index*2+2;
            if(lchild>max_index){
                break;
            }
            else if(rchild>max_index){
                if(heap[index]>heap[lchild]){
                    swap(heap[index],heap[lchild]);
                    index=lchild;

                }
                else
                    break;
            }
            else{
                int smaller=heap[lchild]<=heap[rchild]?lchild:rchild;
                if(heap[index]>heap[smaller]){
                    swap(heap[index],heap[smaller]);
                    index=smaller;

                }
                else
                    break;
            }
        }
    }

};

int main() {
    litterheap heap1;
    for(int i=8;i>0;i--){
        heap1.insert(i);
    }
    heap1.insert(3);
    for(int i=0;i<9;i++){
        cout<<heap1.heap[i];
    }
    cout<<endl;

    heap1.pop();
    heap1.pop();
    cout<<heap1.heap.size()<<endl;
    for(int i=0;i<heap1.heap.size();i++){
        cout<<heap1.heap[i];
    }
    cout<<endl;

// 注释的for循环(1)等同于下面这段for循环(2)
//1)  for(int i=0;i<9;i++){
//        cout<<heap1.heap[i];
//    }
//    cout<<endl;

//2)  for(int i:heap1.heap){
//        cout<<i<<endl;
//    }

//    vector<int> vec;
//    for(int i=0;i<10;i++) {
//        vec.push_back(i);
//    }
//    for(int i:vec) {
//        cout<<i;
//    }
//    cout<<endl;
//    vec.pop_back();
//    for(int i:vec) {
//        cout<<i;
//    }

    return 0;
}

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页