排序演算法整理之堆排序

2021-06-07 10:15:30 字數 1601 閱讀 9265

堆排序(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 ...