排序演算法之堆排序java實現

2021-07-26 05:38:59 字數 1447 閱讀 9992

堆排序(heap sort)的基本思想是迴圈執行如下過程直到陣列為 空:

什麼是最大堆?

堆是乙個具有這樣性質的順序二叉樹,每個非葉子節點的關鍵字大於等於它的孩子結點的關鍵字。顯然在乙個堆中,根節點具有最大值,而且堆中任何乙個結點的非空左、右子樹都是乙個堆,它的根節點到任一葉子的每條路徑上的節點都是遞減有序的。

如何構建初始堆和調整堆?如下圖示

給定 乙個陣列a=,對其進行堆排序,首先構建一棵完全二叉樹,如下所示,

然後構造初始堆,從最後乙個非葉子節點開始調整,調整過程如下:

則圖(d)即為構建的初始堆。

每次調整成為大頂堆,都是從父節點、左孩子節點、右孩子節點中選取值最大的結點與父結點進行交換,交換之後,再對孩子節點進行檢查,使其也調整為滿足堆的性質,如上圖中(c)到(d)的調整。

有了初始堆之後就可以進行排序如下:

經過如上圖所示的子底下那個建堆過程,這個陣列便調整為有序了,如圖(l)所示,其中圖(c),(f),(j),(k),(l)為新建的堆,其他為調整過程。

首先看建立初始堆所需比較次數。假設n個節點的堆的深度為k,即k層結點,由順序二叉樹性質可知,2k-1 <= n < 2k。對每個非葉子節點ri進行一次調整,在最壞的情況下,第j層的節點都下沉k-j層到達最底層,根節點下沉一層,相應的孩子節點上一層需要2次比較,這樣,第j層的乙個節點下沉到最底層最多需要2(k-j)次比較,又有第j層共有2(j-1)個節點,即可算出建立初始堆所需要的比較次數。

然後分析重建新堆所需的比較次數,即n-1次重新構建堆的總比較次數。每次重建乙個堆,僅將新的根節點從第1層下沉到乙個適當的層次上,在最壞的情況下,這個根節點下沉到最底層。每次重建的新堆都比前一次的新堆少乙個節點。

具體分析,在這裡不做過多介紹。

總之,堆排序在最壞的情況下,所需比較次數不超過

時間複雜度為

堆排序是

不穩定的。

把左右子樹都是堆的順序二叉樹調整為乙個堆,其演算法如下:

package sort;

public class heapsort ;

heapsort(array);

for(int i=0;i=0; i--)

return array;

} private static void adjustdowntoup(int array, int k, int length)

return array;

}}

輸出:45 50 53 60 65 69

Java實現 高效排序演算法之堆排序

堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。在處理堆排序時面臨兩個問題 乙個是如何建堆。另乙個是如何在輸出堆頂後進行調整,成為乙個新堆。建堆的過程主要是通過在n 2 取下限 處開始,反覆進行 篩選 的過程。具體過程見演算法分析及注釋。堆排序的偽 heapsort data...

排序演算法之堆排序及Java實現

選擇排序 直接選擇排序,堆排序 交換排序 氣泡排序,快速排序 插入排序 直接插入排序,希爾排序 歸併排序 桶式排序 基數排序 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序。堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 或者每個結點的值...

堆排序演算法(java實現)

public class heapsort 左孩子編號 public static int leftchild int i 右孩子編號 public static int rightchild int i 保持最大堆的性質 param a,堆中的陣列元素 param i,對以該元素為根元素的堆進行調...