最小堆类

来源:互联网 发布:氧气听书软件 编辑:程序博客网 时间:2024/06/06 04:23
/*Name: 最小堆类 Copyright: Author: Date: 20-02-17 09:56Description: */#include<iostream>using namespace std;template <typename type> class MinHeap{public:   MinHeap(int maxSize); //创建一个容量为maxSize的空堆   MinHeap(const type arr[], int len); //根据长度为len的数组arr构造一个最小堆   ~MinHeap() {delete []heap;} //析构函数      bool IsEmpty() const {return size == 0;}   bool IsFull() const {return size == capacity;}   type & GetMin() const {return heap[0];} //返回堆顶的最小元素    bool Insert(const type &x); //将x插入到最小堆   bool DeleteMin(); //删除堆顶的最小元素   void DisPlayHeap(); //输出最小堆的所有元素       private:enum {DefaultSize = 99999}; //默认的最大容量 type *heap;   //存放堆的元素的数组 int capacity; //堆的容量 int size;     //堆的长度,即当前元素个数 void FilterDown(int i); //从下标i到m自顶向下进行调整成为最小堆void FilterUp(int i); //从下标i到0自底向上进行调整成为最小堆};template <typename type> MinHeap<type>::MinHeap(int maxSize){    //先修改maxSize的取值范围     if (maxSize < 0)    {    maxSize = 0;    }    else if (maxSize > DefaultSize)    {    maxSize = DefaultSize;    }        capacity = maxSize;    heap = new type[capacity];    size = 0;}template <typename type> MinHeap<type>::MinHeap(const type arr[], int len){    //先修改len的取值范围     if (len < 0)    {    len = 0;    }    else if (len > DefaultSize)    {    len = DefaultSize;    }        size = capacity = len;    heap = new type[capacity];    for (int i=0; i<len; i++) //先将arr的元素直接复制到heap     { heap[i] = arr[i];}//将heap调整为一个最小堆for (int i=(size-1)/2; i>=0; i--){ FilterDown(i); }}template <typename type> void MinHeap<type>::DisPlayHeap() //输出最小堆的所有元素 {    cout << "输出堆:";    for (int i=0; i<size; i++)    { cout << heap[i] << " ";}cout << endl;}template <typename type> void MinHeap<type>::FilterDown(int i) //从下标i到堆的尾部自顶向下进行调整成为最小堆{    type t = heap[i];   //保存heap[i]的值以备放到适合的位置     int child = i * 2 + 1; //指向左孩子           while (child < size) //有左孩子     {     if (child+1 < size && heap[child+1] < heap[child]) //有右孩子,且右孩子更小些,定位其右孩子               child += 1;                    if (heap[child] < t)//用最小值覆盖其父亲结点的值,即将空位下滤到新的位置         {            heap[i] = heap[child];            i = child;       child = i * 2 + 1;        }          else              break;  }        heap[i] = t;}template <typename type> void MinHeap<type>::FilterUp(int i) //从下标i到0自底向上进行调整成为最小堆{    type t = heap[i];        while (i > 0 && heap[i/2] > t) //若比父亲结点小,则用父亲结点的值覆盖该结点,即将空位上滤到新的位置     {        heap[i] = heap[i/2];           i /= 2;}        heap[i] = t;}template <typename type> bool MinHeap<type>::Insert(const type &x) //将x插入到最小堆{    if (IsFull())    {        cerr << "heap is full" << endl;        return false;    }    //从尾部插入并向上调整成最小堆,然后长度增1     heap[size++] = x;    FilterUp(size-1);     return true;}template <typename type> bool MinHeap<type>::DeleteMin() //删除堆顶的最小元素{    if (IsEmpty())    {        cerr << "heap is empty" << endl;        return false;    }        heap[0] = heap[--size];//用尾部元素覆盖顶部元素,然后长度减1    FilterDown(0); //顶部元素向下调整成最小堆    return true;}int main(){ const int size = 10;MinHeap<int> obj_1(size);      for (int i=0; i<size; i++)      {          obj_1.Insert(rand()%51);      }  obj_1.DisPlayHeap(); //输出最小堆的所有元素 int arr[8] = {3,5,2,7,9,6,8,1};MinHeap<int> obj_2(arr, 8);obj_2.DisPlayHeap(); //输出最小堆的所有元素 cout << "最小值:" << obj_2.GetMin() << endl; obj_2.DeleteMin(); obj_2.DisPlayHeap(); //输出最小堆的所有元素     system("pause");   return 0;}

0 0
原创粉丝点击