排序演算法之堆排序

2021-07-13 04:54:21 字數 1224 閱讀 2087

1.什麼是堆

堆是完全二叉樹。堆分為最大堆和最小堆。最大堆是根節點大於等於左右子樹;最小堆是根節點小於等於左右子樹。儲存堆最常用的資料結構是陣列:所以最大堆的表示:array[i] >= array[2 * i] && array[i] >= array[2 * i + 2];最小堆的表示:array[i] <= array[2 * i] && array[i] <= array[2 * i + 2]。因為用陣列儲存且堆是是完全二叉樹,所以其根節點的索引範圍是0-array.length / 2

2.堆排序的步驟

1)初始化堆,即建立無須的最大堆或最小堆

2)將堆頂元素和最後乙個元素交換,重新調整0至n-1節點,使其成為堆

3)重複步驟2)

3.堆排序的實現

第一步建堆,第二步交換堆頂和最後乙個元素,第三步調整其餘元素使其成為堆

public static void heapsort(int array) 

}

初始化堆的時候,也是通過不斷的調整,使其成為堆

private static void buildheap(int array) 

}

private static void adjustheap(int array, int rootindex, int length) 

if (rightindex < length && array[rightindex] > array[maxindex])

// make the root is max

if (maxindex != rootindex)

} }

調整堆的**思路比較明確:比較堆頂和左右子樹的大小,將最大的放在堆頂,若交換之後的葉子節點也有子樹,則繼續比較。

以上**使用的是遞迴。

下面使用的非遞迴的方式

private static void adjustheapnon(int array, int rootindex, int length) 

if (rightindex < length && array[rightindex] > array[maxindex])

// make the root is max

if (maxindex != rootindex) else

} }

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 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 ...

排序演算法之堆排序

宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...