青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 200, comments - 8, trackbacks - 0, articles - 0

最小堆&&最大堆的實現(c++)(轉)

Posted on 2012-11-19 21:09 鑫龍 閱讀(1221) 評論(1)  編輯 收藏 引用 所屬分類: 數據結構與算法
最小堆:
template<class T>
class MinHeap {
public:
    MinHeap(
int MinHeapSize = 10);
    
~MinHeap() {delete [] heap;}
    
int Size() const {return CurrentSize;}
    T Min() {
if (CurrentSize == 0)
              
throw OutOfBounds();
           
return heap[1];}
    MinHeap
<T>& Insert(const T& x);
    MinHeap
<T>& DeleteMin(T& x);
    
void Initialize(T a[], int size, int ArraySize);
    
void Deactivate() {heap = 0;}
    
void Output() const;
private:
    
int CurrentSize, MaxSize;
    T 
*heap;
};

template
<class T>
MinHeap
<T>::MinHeap(int MinHeapSize)
{
    MaxSize 
= MinHeapSize;
    heap 
= new T[MaxSize+1];
    CurrentSize 
= 0;
}

template
<class T>
MinHeap
<T>& MinHeap<T>::Insert(const T& x)
{
    
if (CurrentSize == MaxSize)
        
throw NoMem();

    
//為x尋找應插入的位置
    
//i從新的葉節點開始,并沿著樹上升
    int i = ++CurrentSize;
    
while (i != 1 && x < heap[i/2]) 
    {
        heap[i] 
= heap[i/2]; // 將元素下移
        i /= 2;                 // 移向父節點
    }
    heap[i] 
= x;

    
return *this;
}

template
<class T>
MinHeap
<T>& MinHeap<T>::DeleteMin(T& x)
{
    
if (CurrentSize == 0)
        
throw OutOfBounds();

    x 
= heap[1];

    T y 
= heap[CurrentSize--]; //最后一個元素

    
// 從根開始, 為y尋找合適的位置
    int i = 1,  // 堆的當前節點
       ci = 2;    // i的子節點

    
while (ci <= CurrentSize) 
    {
        
// 使heap[ci] 是i較小的子節點
        if (ci < CurrentSize 
          
&& heap[ci] > heap[ci+1]) 
            ci
++;

        
// 能把y放入heap[i]嗎?
        if (y <= heap[ci]) 
            
break;  // 能

        
// 不能
        heap[i] = heap[ci]; // 子節點上移
        i = ci;                // 下移一層
        ci *= 2;
    }

    heap[i] 
= y;

    
return *this;
}

template
<class T>
void MinHeap<T>::Initialize(T a[], int size, int ArraySize)
{
   delete [] heap;
   heap 
= a;
   CurrentSize 
= size;
   MaxSize 
= ArraySize;

   
// 產生一個最小堆
   for (int i = CurrentSize/2; i >= 1; i--
   {
        T y 
= heap[i]; // 子樹的根

        
// 尋找放置y的位置
        int c = 2*i; // c 的父節點是y的目標位置

        
while (c <= CurrentSize) 
        {
            
// 使heap[c]是較小的子節點
            if (c < CurrentSize &&
             heap[c] 
> heap[c+1]) c++;

            
// 能把y放入heap[c/2]嗎?
            if (y <= heap[c]) break;  // 能

            
// 不能
            heap[c/2= heap[c]; // 子節點上移
            c *= 2;              // 下移一層
        }

        heap[c
/2= y;
    }
}

template
<class T>
void MinHeap<T>::Output() const
{
    cout 
<< "The " << CurrentSize
        
<< " elements are"<< endl;
    
for (int i = 1; i <= CurrentSize; i++)
      cout 
<< heap[i] << ' ';
    cout 
<< endl;
}


最大堆:
template<class T>
class MaxHeap {
public:
    MaxHeap(
int MaxHeapSize = 10);
    
~MaxHeap() {delete [] heap;}
    
int Size() const {return CurrentSize;}
    T Max() {
if (CurrentSize == 0)
              
throw OutOfBounds();
           
return heap[1];}
    MaxHeap
<T>& Insert(const T& x);
    MaxHeap
<T>& DeleteMax(T& x);
    
void Initialize(T a[], int size, int ArraySize);
    
void Deactivate() {heap = 0;}
    
void Output() const;
private:
    
int CurrentSize, MaxSize;
    T 
*heap;
};

template
<class T>
MaxHeap
<T>::MaxHeap(int MaxHeapSize)
{
    MaxSize 
= MaxHeapSize;
    heap 
= new T[MaxSize+1];
    CurrentSize 
= 0;
}

template
<class T>
MaxHeap
<T>& MaxHeap<T>::Insert(const T& x)
{
    
if (CurrentSize == MaxSize)
        
throw NoMem();

    
//為x尋找應插入的位置
    
//i從新的葉節點開始,并沿著樹上升
    int i = ++CurrentSize;
    
while (i != 1 && x > heap[i/2]) 
    {
        heap[i] 
= heap[i/2]; // 將元素下移
        i /= 2;              // 移向父節點
    }

    heap[i] 
= x;
    
return *this;
}

template
<class T>
MaxHeap
<T>& MaxHeap<T>::DeleteMax(T& x)
{
    
if (CurrentSize == 0)
        
throw OutOfBounds();

    x 
= heap[1];


    T y 
= heap[CurrentSize--]; //最后一個元素

    
// 從根開始, 為y尋找合適的位置
    int i = 1,  // 堆的當前節點
       ci = 2;    // i的子節點

    
while (ci <= CurrentSize)
    {
        
// 使heap[ci] 是i較大的子節點
        if (ci < CurrentSize 
         
&& heap[ci] < heap[ci+1]) 
            ci
++;

        
// 能把y放入heap[i]嗎?
        if (y >= heap[ci]) 
            
break;//

        
//不能
        heap[i] = heap[ci]; // 子節點上移
        i = ci;             // 下移一層
        ci *= 2;
    }

    heap[i] 
= y;

    
return *this;
}

template
<class T>
void MaxHeap<T>::Initialize(T a[], int size, int ArraySize)
{
    delete [] heap;
    heap 
= a;
    CurrentSize 
= size;
    MaxSize 
= ArraySize;

    
// 產生一個最大堆
    for (int i = CurrentSize/2; i >= 1; i--
    {
        T y 
= heap[i]; // 子樹的根

        
// 尋找放置y的位置
        int c = 2*i; // c 的父節點是y的目標位置
                
        
while (c <= CurrentSize) 
        {
            
// 使heap[c]是較大的子節點
            if (c < CurrentSize 
             
&& heap[c] < heap[c+1])
                c
++;

            
// 能把y放入heap[c/2]嗎?
            if (y >= heap[c]) 
                
break;  // 能

            
// 不能
            heap[c/2= heap[c]; // 子節點上移
            c *= 2;                 // 下移一層
        }
        heap[c
/2= y;
    }
}

template
<class T>
void MaxHeap<T>::Output() const
{
   cout 
<< "The " << CurrentSize 
        
<< " elements are"<< endl;
   
for (int i = 1; i <= CurrentSize; i++)
       cout 
<< heap[i] << ' ';
   cout 
<< endl;
}

Feedback

# re: 最小堆&&最大堆的實現(c++)(轉)[未登錄]  回復  更多評論   

2014-04-04 09:47 by ccc
錯誤也太多了吧。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美另类高清视频在线| 亚洲福利视频一区二区| 国产精品欧美日韩| 欧美日韩免费观看一区二区三区| 欧美成年网站| 欧美日韩免费看| 国产精品va在线| 国产精品久久久久999| 国产欧美一区二区精品性色| 国产一区在线视频| 亚洲国产婷婷香蕉久久久久久99| 亚洲精品视频在线| 亚洲欧美电影在线观看| 久久亚洲欧洲| 亚洲精品在线观看免费| 午夜在线a亚洲v天堂网2018| 久久久久久亚洲精品不卡4k岛国| 免费日韩av| 国产精品伊人日日| 在线日韩av片| 中日韩男男gay无套| 久久久爽爽爽美女图片| 亚洲精品在线三区| 久久久久一区二区| 国产精品第13页| 最近看过的日韩成人| 午夜精品剧场| 亚洲人成免费| 久久久久久久网站| 国产精品私拍pans大尺度在线 | 欧美日韩在线亚洲一区蜜芽| 国产美女精品视频| 亚洲最新在线视频| 欧美 日韩 国产 一区| 亚洲一级黄色片| 亚洲大胆美女视频| 亚洲另类一区二区| 久久精品视频在线| 一本色道久久88综合亚洲精品ⅰ | 国内自拍亚洲| 亚洲一区二区三区高清不卡| 欧美福利在线| 久久精品亚洲一区二区| 国产精品久久综合| 国产精品99久久99久久久二8| 久久影视三级福利片| 亚洲综合日韩中文字幕v在线| 欧美成人精品一区二区| 国产一在线精品一区在线观看| 一区二区欧美日韩| 亚洲人成人一区二区三区| 久久天天狠狠| 影音先锋日韩精品| 欧美影视一区| 欧美一级艳片视频免费观看| 国产精品伦一区| 亚洲特黄一级片| 亚洲国产精品99久久久久久久久| 久久精品国产综合精品| 国产一区二区视频在线观看| 欧美影院久久久| 欧美一级视频一区二区| 国产自产高清不卡| 久久久午夜电影| 久久精品免费观看| 亚洲第一中文字幕| 亚洲丁香婷深爱综合| 欧美精品一区二区久久婷婷| 亚洲精品老司机| 亚洲精品偷拍| 国产精品热久久久久夜色精品三区| 亚洲女爱视频在线| 亚洲欧美制服另类日韩| 国产亚洲午夜高清国产拍精品| 欧美综合第一页| 久久人人爽人人爽| 99精品国产在热久久下载| 9色porny自拍视频一区二区| 国产精品综合视频| 免费久久99精品国产| 欧美激情一级片一区二区| 中文日韩电影网站| 欧美一区二区在线看| 亚洲电影免费在线观看| 亚洲区一区二区三区| 国产精品丝袜91| 免费观看久久久4p| 欧美视频官网| 久久九九精品| 欧美sm极限捆绑bd| 欧美一区二区三区日韩| 蜜桃av综合| 欧美一区二视频| 性亚洲最疯狂xxxx高清| 国产精品永久免费| 欧美va天堂在线| 欧美日本三级| 久久国产精品久久精品国产 | 亚洲精品中文在线| 国产精品毛片在线看| 男女精品视频| 国产精品成人一区二区艾草| 久久综合九色九九| 国产精品成人一区二区三区吃奶| 蜜桃av噜噜一区| 国产精品区二区三区日本| 欧美福利小视频| 国产农村妇女毛片精品久久莱园子| 欧美大片在线影院| 国产欧美日韩亚洲| 亚洲乱码国产乱码精品精| 激情亚洲成人| 亚洲欧美成人一区二区在线电影| 亚洲精品极品| 久久久水蜜桃| 欧美一区二区三区在线视频| 欧美日韩精品免费观看视一区二区 | 久久免费99精品久久久久久| 性色av一区二区三区红粉影视| 欧美国产日韩视频| 欧美风情在线观看| 国产自产女人91一区在线观看| 这里只有精品视频在线| 夜夜嗨一区二区三区| 欧美**人妖| 欧美二区乱c少妇| 1000部国产精品成人观看| 欧美一区二区观看视频| 欧美一区二区三区免费观看视频| 欧美日韩一区国产| 亚洲免费观看高清完整版在线观看| 亚洲激情成人网| 久久一区亚洲| 欧美黄网免费在线观看| 亚洲高清一二三区| 蜜桃av噜噜一区| 欧美国产一区视频在线观看| 136国产福利精品导航| 久久视频在线看| 欧美激情五月| 99成人免费视频| 欧美三级网址| 亚洲在线中文字幕| 久久国产精品第一页| 国内自拍一区| 免费不卡在线视频| 亚洲精选一区二区| 亚洲欧美激情精品一区二区| 国产精品女主播| 久久成人资源| 亚洲成色777777女色窝| 午夜久久美女| 亚洲欧洲另类国产综合| 午夜精品久久| 午夜久久99| 欧美在线一级va免费观看| 国产日韩欧美综合一区| 久久精品国产视频| 亚洲国产精品久久久| 夜夜精品视频| 国产区亚洲区欧美区| 久久亚洲电影| 日韩一级在线| 欧美在线一区二区三区| 亚洲国产人成综合网站| 欧美日韩在线播放一区二区| 亚洲欧美日韩一区二区在线 | 欧美国产一区在线| 99av国产精品欲麻豆| 欧美中文在线免费| 亚洲国产综合在线| 国产精品理论片| 免费h精品视频在线播放| 一区二区三区黄色| 欧美va天堂| 欧美一区二区三区免费看| 亚洲欧洲一区二区三区久久| 国产精品日本欧美一区二区三区| 噜噜噜久久亚洲精品国产品小说| 一本久久a久久免费精品不卡| 麻豆成人精品| 亚洲私人影院| 亚洲激情成人在线| 国产一区二区福利| 欧美婷婷在线| 男人的天堂亚洲在线| 小黄鸭精品aⅴ导航网站入口| 91久久精品国产91久久| 老司机午夜精品视频| 欧美一区二区免费视频| 一本大道久久a久久精二百| 激情婷婷欧美| 国产亚洲精品久久久久久| 欧美性猛交xxxx乱大交蜜桃| 欧美88av| 美日韩免费视频| 久久亚洲不卡| 久久乐国产精品| 久久精品一区二区三区四区 | 国产精品黄视频|