国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

堆   堆元素的插入  最小堆  堆元素的移除

2019-11-08 19:55:32
字體:
來源:轉載
供稿:網友
#ifndef _HEAP_H#define _HEAP_Htemplate<class Type>void exchange(Type *a,Type *b){    Type tm=*a;    *a=*b;    *b=tm;}template<class Type>class heap{public:heap(){    capacity=DEFAULT_SIZE;    base=new Type[capacity];    size=0;}heap(Type *ar,int sz){    capacity=sz>DEFAULT_SIZE?sz:DEFAULT_SIZE;    base=new Type[capacity];    for(int i=0;i<sz;++i)    base[i]=ar[i];    size=sz;    for(int i=size/2-1;i>=0;--i)    siftdown(i,size-1);}~heap(){    delete []base;    capacity=size=0;}bool full(){return size==capacity;}bool   empty(){return size==0;}void showHeap(){    for(int i=0;i<size;++i)    cout<<base[i]<<"  ";    cout<<endl;}void siftdown(int start,int end){    int min=2*start+1;    if(2*start+2<=end&&base[2*start+2]<base[2*start+1])    min=start*2+2;    if(base[min]>base[start])    min=start;    exchange(&base[min],&base[start]);    if(min!=start&&2*min+1<end)    siftdown(min,end);}void siftup(){    for(int i=size-1;(i-1)/2>=0;)    {        if(base[i]<base[(i-1)/2])        {            exchange(&base[i],&base[(i-1)/2]);            i=(i-1)/2;        }        else        break;    }}void Remove();void Insert(Type x);PRivate:enum{DEFAULT_SIZE=20};Type *base;int capacity;int size;};template<class Type>void heap<Type>::Remove(){if(!empty())    {        base[0]=base[--size];        siftdown(0,size-1);    }}template<class Type>void heap<Type>::Insert(Type x){    if(!full())    {        base[size++]=x;        siftup();    }    else    {///////////////    }}#endif

稍微改動過的版本:

#pragma once#include<iostream>using namespace std;template<class Type>class MinHeap{public:    MinHeap(int sz = DEFAULT_HEAP_SIZE)    {        capacity = sz > DEFAULT_HEAP_SIZE ? sz : DEFAULT_HEAP_SIZE;        heap = new Type[capacity];        size = 0;    }    MinHeap(Type ar[], int n)    {        capacity = n>DEFAULT_HEAP_SIZE?n:DEFAULT_HEAP_SIZE;        heap = new Type[capacity];        for(int i=0; i<n; ++i)        {            heap[i] = ar[i];        }        size = n;        int curpos = n/2-1;        while(curpos >= 0)        {            siftDown(curpos,size-1);            curpos--;        }    }    ~MinHeap()    {        delete []heap;        capacity = size = 0;    }public:    bool IsFull()const    {        return size >= capacity;    }    bool IsEmpty()const    {        return size == 0;    }public:    void ShowHeap()const    {        for(int i=0; i<size;++i)        {            cout<<heap[i]<<" ";        }        cout<<endl;    }public:    void Insert(Type x)    {        if(!IsFull())        {            heap[size] = x;            siftUp(size);            size++;        }    }    Type Remove()    {        Type val;        if(!IsEmpty())        {            val = heap[0];            heap[0] = heap[size-1];            size--;            siftDown(0,size-1);        }        return val;    }private:    void siftDown(int start, int m);    void siftUp(int start);private:    enum{DEFAULT_HEAP_SIZE=20};    Type *heap;    int capacity;    int size;};template<class Type>void MinHeap<Type>::siftDown(int start, int m)//非遞歸版本的{    int i = start;    int j = 2*i+1;    while(j <= m)    {        if(j+1<=m && heap[j]>heap[j+1])            j = j+1;        if(heap[j] < heap[i])        {            Type tmp = heap[j];            heap[j] = heap[i];            heap[i] = tmp;        }        else            break;        i = j;        j = 2*i+1;    }}template<class Type>void MinHeap<Type>::siftUp(int start){    int j = start; //    int i = (j-1)/2; //    while(j > 0)    {        if(heap[i] < heap[j])            break;        else        {            Type tmp = heap[i];            heap[i] = heap[j];            heap[j] = tmp;        }        j = i;        i = (j-1)/2;    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 砀山县| 金寨县| 靖宇县| 松溪县| 海口市| 宜良县| 阿坝县| 宝应县| 通渭县| 西青区| 平山县| 拉萨市| 高淳县| 四平市| 微博| 贡嘎县| 微山县| 金华市| 海宁市| 合水县| 长岛县| 界首市| 萨迦县| 托克逊县| 淄博市| 普兰县| 蒲江县| 综艺| 宁晋县| 德安县| 新化县| 梓潼县| 九江市| 裕民县| 汶川县| 邳州市| 防城港市| 景宁| 楚雄市| 阜康市| 朝阳县|