排序 堆排序

2021-07-03 10:27:01 字數 577 閱讀 1526

一、什麼是堆

堆是具有如下性質的完全二叉樹。每個節點大於或者等於其左右孩子結點的值,稱為大頂堆。

或者每個結點的值都小於或者等於左右孩子結點的值,稱為小頂堆。

二、如果通過堆排序

由堆的定義可以知道,在堆中,頂點最大(或者最小)。我們就可以把堆頂拿出來,再把剩下的再次組成堆。然後再拿出堆頂。

這樣就實現排序啦。

還需要解決兩個問題:

(1)如何把一凌亂的資料組成堆

(2)把頂點拿出來之後,如何重建堆。

三、如何由乙個無序的序列建成乙個堆

找到第(n/2)個數。為什麼要找到這個數?因為由於慢二叉樹的性質可知,此數都是有孩子的結點。

也就是通過這些數,來包含了所有的結點。

for(i=(n/2);i>=1;i--)

和自己的左右孩子的最大值比較,如果比它大,則不變動。

如果小,則交換。

四、如何在輸出堆頂元素後,調整剩餘元素成為乙個新的堆

(1)將最後乙個元素換到頂部。

(2)然後依次和自己的孩子比較,將大的孩子放到堆頂。直到成為葉子節點。

五、時間複雜度為o(n*log(n))

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 模擬堆排序

838.堆排序 輸入乙個長度為n的整數數列,從小到大輸出前m小的數。輸入格式 第一行包含整數n和m。第二行包含n個整數,表示整數數列。輸出格式 共一行,包含m個整數,表示整數數列中前m小的數。資料範圍 1 m n 1051 m n 105,1 數列中元素 1091 數列中元素 109 輸入樣例 5 ...