經典排序 之 堆排

2021-07-29 05:45:20 字數 648 閱讀 4278

1. 堆排的時間複雜度為o(nlogn), 空間複雜度為o(1)。

2. 先上原汁原味手寫的**

void heapadjust(vector& array, int len, int idx) 

if(right < len && array[right] > maxvalue)

if(idx != maxidx) //如果該節點比左右孩子其中乙個要小,則交換,並進一步調整交換後的孩子節點

}}void heapinit(vector& array)

void heapsort(vector& array)

}

堆排的思想基於構造乙個完全二叉樹,以最小堆為例子,步驟為:先初始化堆,然後逐次把根(最大值)放到樹的末尾,並從根處重新調整。

注意點:a. 當樹的下標為01234時,對於下標為 i 的節點,左右孩子分別 2*i+1, 2*i+2。

b. 注意樹長度和相應座標的關係。

c. 初始化堆時,其實可以只從非葉子節點開始,對應的座標為(array.size()/2 - 1),不要搞錯。如果容易記錯,可以直接從末尾array.size()-1開始,這樣進入adjust裡也不會進行調整,不影響結果。

3. 堆排經常用於 top k 這樣的問題上面。

經典演算法 堆排

一直以為堆排的實現會很困難,書上的原理解釋那麼長,結果實現起來 會如此的簡短。堆排,建立大根堆 從小大到排列 includeusing namespace std heap 堆 void heapadjust int heap,int n,int length heap n tmp void hea...

排序總結 堆排

核心函式 adjustdown nums,i,n 將 i 節點下沉。void adjustdown int arr,int i,int n else break 通過自底向上對每個節點呼叫下沉函式adjustdown,就能實現建立最大堆 最小堆。因為葉節點不存在子節點,所以實際上i從 n 2 1開始...

排序演算法 堆排

堆排序 如果將堆結構中的資料看作是一顆完全二叉樹的各個節點,那麼堆的性質就是滿足如下性質的完全二叉樹 樹中任意非葉子節點的關鍵碼均不大於或不小於其左右孩子節點的關鍵碼。利用堆的有序性及其運算,可以容易的實現選擇排序的方法稱為堆排序。假設欲對含有n個物件的序列v 0 v 1 v n 1 進行堆排序,演...