堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的過程是: 1.
建立乙個堆 2.
把堆首(最大值)和堆尾互換 3.
把堆的尺寸縮小1,目的是把新的陣列頂端資料調整到相應位置 4.
重複步驟2,直到堆的尺寸為1
要知道構建堆,就必須了解二叉樹的模型。如圖:
構建大根堆步驟,如圖:
第一步:首先我們發現,這個堆中有2個父節點(2,,3);
第二步:比較2這個父節點的兩個孩子(4,5),發現5大。
第三步:然後將較大的右孩子(5)跟父節點(2)進行交換,至此3的左孩子堆構建完畢,
如圖:
第四步:比較第二個父節點(3)下面的左右孩子(5,1),發現左孩子5大。
第五步:然後父節點(3)與左孩子(5)進行交換,注意,交換後,堆可能會遭到破壞,
必須按照以上的步驟一,步驟二,步驟三進行重新構造堆。
最後構造的堆如下:
第二:輸出大根堆。
至此,我們把大根堆構造出來了,那怎麼輸出呢?我們做大根堆的目的就是要找出最大值,
那麼我們將堆頂(5)與堆尾(2)進行交換,然後將(5)剔除根堆,由於堆頂現在是(2),
所以破壞了根堆,必須重新構造,構造完之後又會出現最大值,再次交換和剔除,最後也就是俺們
實現**:
public class heapsort
// 最後將temp值賦給較大的子節點,以形成兩值交換
array[parent] = temp;
} //堆排序
public static void heapsort(int array)
// 最後輸出堆元素
for (int i = array.length - 1; i > 0; i--) }
public static void main(string args) ;
system.out.println("排序前:" + arrays.tostring(array));
heapsort(array);
system.out.println("排序後:" + arrays.tostring(array));
}}
執行結果:
排序前:
[2, 5, 1, 8, 9, 3]
排序後:
[1, 2, 3, 5, 8, 9]
演算法 堆排序整理
堆排序的結構形態是用乙個陣列實現了乙個二叉樹,堆分為最大堆和最小堆兩種,最大堆指的是該二叉樹的任意乙個父節點都比其相連的子節點大,最小堆則反之。對於最大堆來說,其根節點就是整個堆的最大值。那麼對於堆排序演算法來說,主要做的是兩件事,首先是建堆,之後可以通過堆來依次獲取大小有序的數值,每取乙個值都需要...
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...
排序演算法之堆排序
堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...