最(大)小堆的性質:
(1)是一顆完全二叉樹,遵循完全二叉樹的所有性質。
(2)父節點的鍵值(大於)小於等於子節點的鍵值
(3)在堆排序中我們通常用的是最大堆,最小堆通常用在優先佇列中(尚未找到恰當的例子)。
堆排序:
陣列:a[10]=可以利用建堆的方式對其進行排序。因為堆是一顆完全二叉樹,根據完全二叉樹的性質可以得知:對陣列進行建堆之後,給定任意下標節點其父節點下標parent(i)=i/2 (取下整數)。左孩子下標為left(i)=2*i 。右孩子下標為right(i)=2*i+1.如下圖所示
堆排序**見如下:
[cpp]view plain
copy
#include
using
namespace std;
//獲取父節點
int parent(int i)
//獲取左孩子
int left(int i)
//獲取右孩子
int right(int i)
//從i節點開始生成最大堆
void maxheap(int *a,int i,int length)
else
largest=i;
if(r<=length&&a[r-1]>a[largest-1])
if(largest!=i)
} //將整個樹生成最大堆
void build_max_heap(int *a,int length)
} //堆排序
void heapsort(int *a,int length)
} int main()
; heapsort(a,10);
for(int i=0;i<10;i++)
cout<}
利用最小堆對陣列進行排序的實現**如下:
[cpp]view plain
copy
#include
using
namespace std;
template
class minheap
minheap(type a,int n);
bool insert(type n);
bool isfull()
bool isempty()
bool delete(type n);
void adjust(int start,int n);
void print();
void sorte();
};
template
minheap::minheap(type a, int n)
int temp=(maxsize-2)/2;
for(int i=temp;i>=0;i--)
} template
bool minheap::insert(type n)
heap[currentsize]=n;
int j=currentsize;
while(j>0)
currentsize++;
return 1;
} template
bool minheap::delete(type n)
bool flag=0;
for(int i=0;i
if(i==currentsize-1&&flag==0)
} return 1;
} template
void minheap::print()
cout<}
template
void minheap::adjust(int start, int n)
else
min=start;
if(heap[min]>heap[r]&&r
if(start!=min)
} template
void minheap::sorte()
} int main()
; minheap heape(init,30);
heape.print();
cout<
heape.insert(20);
heape.print();
cout<
heape.delete(20);
heape.sorte();
heape.print();
cout<
return 0;
}
最大堆 最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...