Heap

来源:互联网 发布:美团收银软件 编辑:程序博客网 时间:2024/05/16 11:54
heap,堆是一种完全二叉树,所以可以选择array来存储所有节点。实现heap仅需要一个array和一组heap算法(用来插入、删除元素,取极值,将某一整组数据排列成一个heap),根据元素排列方式,分为大根堆和小根堆。
heap中所有元素都遵循特别的排列规则,所以heap不提供遍历功能,也不提供迭代器。

heap算法:C++代码实现,非STL源码。

//heap算法,底层用vector实现#include<iostream>#include<vector>#include<iterator>using namespace std;vector<int> vec;int max(vector<int>& vec,int i){    int tmp=i-1;    if(vec[tmp]<vec[2*i-1])        tmp=2*i-1;    if(vec[tmp]<vec[2*i])        tmp=2*i;    return tmp;}void swap(int& num1,int& num2){    int tmp=num1;    num1=num2;    num2=tmp;}//初始化vector数据void initVector(){    for(int i=0;i<10;i++)        vec.push_back(i);}//对当前节点所在的只有三个节点存在的树进行排序void sort_heap(vector<int>& vec,int k,int len){    int tmp=k;    int i=2*k+1;    while(i<len)    {        if(i*2+1<len)            sort_heap(vec,i,len);        if(i*2+2<len)            sort_heap(vec,i+1,len);        if(vec[i]<vec[i+1])            i++;        if(vec[tmp]>vec[i])            break;        tmp=i;        i=i*2+1;    }    if(k!=tmp)        swap(vec[tmp],vec[k]);    return;}//构建大根堆void make_heap(vector<int>& vec,int len){    for(int i=0;i<len;i++)        sort_heap(vec,i,len);}//输出heapvoid show_heap(vector<int>& vec){    vector<int>::iterator first=vec.begin();    vector<int>::iterator last=vec.end();    while(first!=last)    {        cout<<*first<<" ";        ++first;    }    cout<<endl;}//插入新元素后向上调整void push_heap(int k){    int tmp=vec[k];    int i=(k+1)/2-1;    while(i>=0)    {        if(vec[i]>=tmp)            break;        else        {            vec[k]=vec[i];            k=i;            i=(k+1)/2-1;        }    }    vec[k]=tmp;}//删除堆顶元素并向下调整void pop_heap(vector<int>& vec,int len){    swap(vec[0],vec[len-1]);    show_heap(vec);    make_heap(vec,len-2);    vec.pop_back();}int main(){    initVector();    int len=vec.size();    //构建大根堆    make_heap(vec,len);    show_heap(vec);    //插入新元素    vec.push_back(len++);    push_heap(len-1);    show_heap(vec);    //删除堆顶元素    pop_heap(vec,len);    show_heap(vec);    return 0;}


0 0
原创粉丝点击