我之前的文章解析過排序的幾種方法,這次的堆排序原理很好理解,但**的實現並不簡單,我覺得不適合入門。
堆排序的實現實際上是把根節點提取出來,不管是最大堆還是最小堆,根節點永遠是極值。
①乙個交換函式——在**中實現交換。
②向下調整函式——它的作用是調整函式使它符合堆的特點。
③乙個建立堆的函式
④刪除函式——每次刪除極值。
⑤主函式
將99、5、36、7、22、17、46、12、2、19、25、28、1、92排序
#include
int h[
101]
;//用來存放對的陣列
int n;
//用來記錄堆中元素個數
//交換函式
void
swap
(int x,
int y)
//下調函式
void
siftdown
(int i)
//i為傳入調整節點,這次為下調,上調同理
//若果不相等說明有更小值
if(t!=i)
else
flag=1;
}return;}
//建立堆
void
creat()
return;}
//提取跟函式
intdeletemax()
intmain()
排序問題 堆排序
堆排序是基於優先佇列 使用基於陣列的大頂堆或者小頂堆 的排序,是乙個 建堆 刪除 調整 刪除 調整 的過程。在 個元素組成的二叉堆中,建堆的時間複雜度是o n 之後執行n次刪除堆頂元素和調整 時間複雜度為o logn 將每次刪除的元素一次放入乙個序列中便得到了乙個有序數列,時間複雜度為o n o n...
堆排序問題
堆,本質上是乙個完全二叉樹,可以用陣列來表示,這樣非常的方便。最大堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最大堆 最小堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最小堆。ifndef dui ...
堆排序問題
給出乙個記錄序列,用堆排序的方法將其進行公升序排列,輸出結果,輸出時要求有文字說明。請任選一種語言編寫程式實現上述演算法,並分析其演算法複雜度 堆排序 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。首先簡單...