堆排沒有用到遞迴,一般堆排是兩個步驟,
1、建立堆
2、不斷的調整堆,進行排序
首先,我們學習堆排就必須了解什麼是堆,堆其實是一種比較特殊的資料結構,分為大根堆和小根堆,堆有兩個性質
1、它是乙個完全二叉樹,每個節點都比它的子樹所有節點大(大根堆)
2、由於他是乙個完全二叉樹,那麼它的每個位置都與陣列的每個下標一一對應
由於這兩種性質,我們就可將陣列看做乙個完全二叉樹,
第一步(大根堆),將這個完全二叉樹轉換成堆,從第乙個節點開始,與他的父節點比較大小,如果比他的父節點要大,那麼他就和父節點進行交換,然後繼續與父節點比較,如果比父節點要小,那麼就停止比較,它也就找到了它的位置。以此類推,從第乙個節點到最後乙個節點都是如此操作。
第二步、找到未被交換的最後乙個節點,此時第乙個節點肯定是最大的,將第乙個節點與最後乙個節點進行交換,此時整個陣列不再是乙個大根堆(不包含最後乙個數),對陣列進行調整,將第乙個節點與左右孩子進行比較,如果比左右孩子大,不用調整,如果比左右孩子小,交換,繼續,向下比較,直到比較比左右孩子小,或者走到倒數第二個數(倒數第乙個已經被交換了)。
重複第二步驟
public
void heapsort (
int[
] arr)
for(
int i =
0; i<= arr.length-
1;i ++
)int size = arr.length;
swap
(arr,0,
--size)
;while
(size>0)
}public
void buildheap (
int[
] arr,
int index)
}public
void filheap (
int[
] arr ,
int index,
int size)
swap
(arr,index,largest)
; index =largest;
left = index*2+
1;}
堆排學習筆記
堆排的本質是構成乙個二叉樹,其二叉樹的特性是子樹都比其父親的數值要小 針對從大到小的排序而言,這種樹叫最大堆 堆排序一共分成三步 1.構建初始二叉樹,將本無序的堆疊,以最大堆的形式重新構造,以便於接下來的步驟的進行 2.將最大的數字 位於樹的根部 和最底端的數字交換 換到陣列最後面 再將最底端被交換...
堆排的實現
堆排實際上是一種選擇排序,堆其實就是一棵完全二叉樹,任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 key key 2i 2 稱為大頂堆,滿足 key i key 2i 1 key i key 2i 2 稱為小頂堆。由上述性質可知...
快排和堆排
一 快速排序 最常用的排序演算法,速度通常也是最快的。時間複雜度 o nlogn 最壞 o n 2 空間複雜度 o nlgn 不穩定 比如 5 3 3 4 3 8 9 10 11 這個序列,在中樞元素5和3交換就會把元素3的穩定性打亂 實現原理 快排主要是通過選擇乙個關鍵值作為基準值。比基準值小的都...