堆排序的進一步理解

2022-07-29 04:39:09 字數 1083 閱讀 2947

堆-顧名思義,上面小,下面大,或者上面大,下面小。

在堆排序過程中,首先應該建堆。如何將陣列中的元素建立成乙個規範的堆行結構。

二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性:

1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。

2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。

當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆

假設根結點的下標為1,則第 i 個結點的父結點下標為 i / 2 , 第 i 個結點的左子結點的下標為2*i, 右子結點的下標為2*i+1 ;

如何才能使得陣列中元素形成堆的結構呢?首先將父結點、左子結點、右子結點這三個結點看成乙個小堆或者乙個小三角形,葉子結點無左子結點和右子結點,所以預設葉子結點為堆結構。則最後乙個元素的父結點下標為 i/2, 從 i/2 開始,直到根結點為止,小三角形的面積逐漸增大,到根結點時達到最大,也就完成了堆的建立。

接下來進行的是堆排序操作,由於根結點元素為最大元素,每次先將根結點元素和最後乙個元素調換,然後再調整堆即可,直到堆中元素只剩乙個時結束,這樣陣列中的元素就為有序的元素。具體**如下:

#includevoid maxheap(int a ,  int i , int

n)

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 按照正常的情況,如果我們要建...