最小堆與最大堆

2021-08-11 04:48:29 字數 3568 閱讀 5687

wang-程式設計日記三:

最小堆最小堆的實質是把樹儲存在乙個陣列,在陣列中,非葉結點的左子樹在陣列中的下標(設為x) = 該結點在陣列中的下標 * 2 + 1;那麼x + 1就是該結點的右子樹.;

相反的如果某結點在陣列中的下標為x,那麼其父結點為 (x - 1)/2。

在乙個單個的結點a和其左右子樹b.c中,把其中最小的值賦給結點a,在這三個結點中a結點的值就變為最小的了。

從下到上或從上到下對每乙個結點進行此操作就可以把根結點的值變為所有結點中的最小的,每個結點的值小於其左右子樹的值,這就是最小堆.

最小堆**:

#ifndef

minheap_h

#define

minheap_h

template

t>

class

minheap

//析構函式

bool

insert(t&x);

//將x插入最小堆中

bool

removemin(t

&x);

//刪除堆頂上的最小元素

bool

isempty()const

//判斷堆是否為空

bool

isfull()const//判斷堆是否滿

void

makeempty()

//把堆置空

private:
t

*heap;

//存放最大堆的陣列

int

currentsize;

//最小堆當前元素個數

int

minheapsize;

//最小堆最多允許元素個數

void

siftdown(int

start,

intm);

//從start到m下滑調整成為最小堆

void

siftup(int

start);

//從start到0上移調整成為最小堆

};
template

t>

minheap

::minheap(int

sz)

;
template

t>

minheap

::minheap(t

arr,

intn)

;
};
template

t>

void

minheap

::siftdown(int

start,

intm)

//否則交換位置並交換起始位置

};

heap[i]=temp;

};
template

t>

void

minheap

::siftup(int

start)

}

heap[j]=temp;

};
template

t>

bool

minheap

::insert(t

&x)

;
template

t>

bool

minheap

::removemin(t

&x)

;
#endif

//minheap_h

最大堆:

最大堆與最小堆類似,只是在判斷結點(假設為x時)與其左右子樹的值時把最大的值付給了x。

template

t>

class

maxheap

//析構函式

bool

insert(t&x);

//將x插入最大堆中

bool

removemax(t

&x);

//刪除堆頂上的最大元素

bool

isempty()const

//判斷堆是否為空

bool

isfull()const//判斷堆是否滿

void

makeempty()

//把堆置空

private:

t*heap;

//存放最大堆的陣列

intcurrentsize;

//最大堆當前元素個數

intmaxheapsize;

//最大堆最多允許元素個數

void

siftdown(int

start,

intm);

//從start到m下滑調整成為最大堆

void

siftup(int

start);

//從start到0下滑調整成為最大堆

};
template

t>

maxheap

::maxheap(int

sz)

;
template

t>

maxheap

::maxheap(t

arr,

intn)

;
};
template

t>

bool

maxheap

::insert(t

&x)

;
template

t>

bool

maxheap

::removemax(t

&x)

;
template

t>

void

maxheap

::siftdown(int

start,

intm)

//否則交換位置並交換起始位置

};

heap[i]=temp;

};
template

t>

void

maxheap

::siftup(int

start)

}

heap[j]=temp;

};

----------wang

最小堆與最大堆

最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。上圖 通常來說,最小堆用於排序找到一堆資料裡面的最小的。因為最小值一定會上浮到根結點。通常用於優先佇列。定時器...

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...