變治演算法之堆排序

2021-07-30 11:40:31 字數 658 閱讀 1258

堆可以定義為一顆二叉樹,樹中每個節點對應乙個鍵值,並且滿足以下兩個條件:其一樹是完全二叉樹,其二是每個結點的鍵值都小於等於它的兩個子女的鍵值。(有的教材說是大於,本質上是不變的)。關於堆的解釋及演算法推導這裡不做解釋,可以參考:

對於調整處序號為k的調整演算法,稱之為篩選演算法,通過篩選演算法,可以將任意乙個排序碼序列建成乙個堆,堆的第乙個元素,即完全二叉樹的根節點是排序碼中最小的,將選出的排序碼從堆中刪除,對剩餘的部分重新建堆,可以繼續選出其中的最小者,直到剩餘乙個元素排序即告結束。

而刪除完全二叉樹中的根節點重新建堆,不需要從頭再來,有效的方法是將當前堆中的最後乙個元素和根節點交換位置,同時讓堆中元素減一,因為此時根節點的左右結點都還滿足堆的條件,所以可以從根節點處利用篩選演算法繼續調整建堆。

具體的例子請看下面:

#include #include //篩選演算法,k為調整位置,m為堆的大小

void sift(int *a,int k,int m)

for (i=10;i>=2;i--) //i表示當前堆的大小,即等待排序的元素的個數

}int main()

; int i=0;

heapsort(a);

for(i=1;i<10;i++)

return 0;

}

演算法筆記005 堆排序 變治法

用基於變治法的堆排序演算法對任意一組給定的資料進行排序 1 深刻理解並掌握變治法的設計思想 2 掌握堆的概念以及如何用變治法把任意給定的一組資料改變成堆 3 提高應用變治法設計演算法的技能。1 設計與實現堆排序演算法 2 待排序的資料可以手工輸入 通常規模比較小,10個資料左右 用以檢測程式的正確性...

演算法筆記 005 堆排序問題 變治法

目錄1 問題描述2 解決方案2.1 堆排序原理簡介 2.2 變治法原理簡介 2.3 具體編碼 2.4 執行結果截圖 用基於變治法的堆排序演算法對任意一組給定的資料進行排序 1 深刻理解並掌握變治法的設計思想 2 掌握堆的概念以及如何用變治法把任意給定的一組資料改變成堆 3 提高應用變治法設計演算法的...

演算法 排序演算法之堆排序

package sortarith 堆排序 構建最大堆,堆頂即為最大元素,每次取出最大元素後,再重新構建堆,這樣再拿出次大值,迴圈往返 注意 構建堆時需要調整每個非葉子節點,確定其為子堆的最大值 而調整堆時,只需要調整堆頂元素 特例1 若所給待排序陣列array本身已是最大堆型別,可不進行構建堆,即...