資料結構與演算法 堆排序

2022-07-08 11:21:15 字數 1300 閱讀 4422

目錄堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

大頂堆:每個節點的值都大於或等於其子節點的值,在堆排序演算法中用於公升序排列;

小頂堆:每個節點的值都小於或等於其子節點的值,在堆排序演算法中用於降序排列;

堆排序的平均時間複雜度為 ο(nlogn)。

通常堆是通過一維陣列來實現的。在陣列起始位置為0的情形中:

在堆的資料結構中,堆中的最大值總是位於根節點(在優先佇列中使用堆的話堆中的最小值位於根節點)。堆中定義以下幾種操作:

首先第一步和第二步,建立堆,這裡我們用最大堆;建立過程中,保證調整堆的特性。

從最後乙個分支的節點開始從右往左,從下至上進行調整為最大堆。

現在得到的最大堆的儲存結構如下:

初始堆建立完成。

接著,最後一步,堆排序,進行(n-1)次迴圈。

持續整個過程直至最後乙個元素為止。

這個迭代持續直至最後乙個元素即完成堆排序步驟。

public class heapsort 

/*** 堆排序的主要入口方法,共兩步。

*/public void sort()

}private void swap(int i, int j)

/*** 調整索引為 index 處的資料,使其符合堆的特性。

** @param index 需要堆化處理的資料的索引

* @param len 未排序的堆(陣列)的長度

*/private void maxheapify(int index, int len)

}/**

* 測試用例

** 輸出:

* [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]

*/public static void main(string args) ;

new heapsort(arr).sort();

system.out.println(arrays.tostring(arr));}}

資料結構與演算法 堆排序

1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...

資料結構與演算法 堆排序

基礎概念 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。通俗理解 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新...

資料結構與演算法 堆排序

堆排序堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質 即子節點的鍵值或索引總是小於 或者大於 它的父節點,堆排序的時間複雜度為o nlogn 來自維基百科 什麼是堆 堆是一種特殊的完全二叉樹,它的性質為 任意節點大於等於或者小於等於它的左右節點。...