堆-顧名思義,上面小,下面大,或者上面大,下面小。
在堆排序過程中,首先應該建堆。如何將陣列中的元素建立成乙個規範的堆行結構。
二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性:
1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。
假設根結點的下標為1,則第 i 個結點的父結點下標為 i / 2 , 第 i 個結點的左子結點的下標為2*i, 右子結點的下標為2*i+1 ;
如何才能使得陣列中元素形成堆的結構呢?首先將父結點、左子結點、右子結點這三個結點看成乙個小堆或者乙個小三角形,葉子結點無左子結點和右子結點,所以預設葉子結點為堆結構。則最後乙個元素的父結點下標為 i/2, 從 i/2 開始,直到根結點為止,小三角形的面積逐漸增大,到根結點時達到最大,也就完成了堆的建立。
接下來進行的是堆排序操作,由於根結點元素為最大元素,每次先將根結點元素和最後乙個元素調換,然後再調整堆即可,直到堆中元素只剩乙個時結束,這樣陣列中的元素就為有序的元素。具體**如下:
#includevoid maxheap(int a , int i , intn)
a[i] = a[0
] ;}
void makemaxheap(int a , int
n )
void swap(int &a , int &b)
void delete(int a , int
n )
intmain() ;
makemaxheap(a,
10) ;
inti ;
for(i = 1 ; i < 11 ; i++)
printf(
"%d
",a[i]) ;
printf("\n
") ;
return0;
}
堆排序的進一步理解
堆 顧名思義,上面小,下面大,或者上面大,下面小。在堆排序過程中,首先應該建堆。如何將陣列中的元素建立成乙個規範的堆行結構。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最...
bufferedReader進一步理解
public static void main string args string mystring system.out.println 請輸入明文 bufferedreader buf new bufferedreader new inputstreamreader system.in try...
進一步理解委託
前面一篇文章介紹了委託的基本知識,接下來就進一步研究一下委託。其實,剛開始覺得委託型別是乙個比較難理解的概念,怎麼也不覺得下面的 assembleiphonehandler 是乙個型別。public delegate void assembleiphonehandler 按照正常的情況,如果我們要建...