最大堆 最小堆 堆排序

2021-07-03 15:33:18 字數 2400 閱讀 9955

最(大)小堆的性質

(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的左...