拖欠很久的堆

来源:互联网 发布:windows ping端口命令 编辑:程序博客网 时间:2024/03/29 01:27
#include<vector>#include<iostream>using namespace std;//最小堆template<typename T>class Heap{public:    typedef T elemtype;    Heap(T *revarr, int size) :cursize(size)    {        for (int i = 0; i < cursize; i++)        {            arr.push_back(revarr[i]);        }        setheap();    }    //由该结点向下调整堆    void downadjust(int pos)    {        int start = pos;        int end = cursize;        int i = start * 2 + 1;        T temp = arr[start];        while (i < end)        {            if (i + 1 < end && arr[i] > arr[i + 1]) i++;            if (arr[i] < temp)            {                arr[start] = arr[i];                start = i;            }            else            {                break;            }            i = i * 2 + 1;        }        arr[start] = temp;    }    //由该节点向上调整该节点    void upadjust(int pos)    {        int end = pos;        int start = cursize - 1;        int i = (start - 1) / 2;        T temp = arr[start];        while (i >= end)        {            if (arr[i] >= temp)            {                break;            }            else            {                arr[start] = arr[i];                start = i;            }            i = (i - 1) / 2;        }    }    bool remove(T * data)    {        if (data == NULL || arr.size() == 0)        {            return false;        }        *data = arr[0];        --cursize;        if (cursize != 0)        {            arr[0] = arr[cursize];            arr.pop_back();            downadjust(0);        }        return true;    }    void insert(T data)    {        cursize++;        arr.push_back(data);        upadjust(0);    }    void show()    {        for (unsigned i = 0; i < arr.size(); i++)        {            cout << arr[i]<<"   ";        }        cout << endl;    }private:    void setheap()    {        for (int pos = (cursize - 1) / 2; pos >= 0; --pos)            downadjust(pos);    }    int cursize;    vector<T> arr;};int main(){    int arr[] = {1,2,3,7,6,4,5,0};    Heap<int> heap(arr,8);    int data;    heap.show();    for (int i = 0; i < 8; i++)    {        heap.remove(&data);        cout << data << endl;    }    return 0;}

堆排序和堆的相关知识很重要但是却一直没有写过堆的相关代码,今天写写,练练手。
想起杨老师说过的一句话,如果我让你写优先队列怎么办?
优先队列其实就是我们上面的堆这种结构。只是堆顶是优先级最高而已。

0 0