首先呢,希望學習堆排序的各位千萬不要以為這個演算法有多麼的難,可以理解為「構造樹」。
堆排序的過程就是構造樹的過程。
這裡先指明三個公式:
假設當前節點下標為i,則
排序的過程:
假設待排序陣列為int a[10];
1.遍歷所有非葉子的節點,建立大根堆/小根堆的完全二叉樹
2.將樹的根節點(a[0])與最後的子節點(a[9])交換位置
3.把前面的9個元素重新建立樹
4.將樹的根節點(a[0])與最後的子節點(a[8])交換位置
5.把前面的8個元素重新建立樹
6. …
7.直到交換完畢
這麼說不知道多少人能理解………..本人不太會畫圖,提供一篇文章,我覺得裡面的圖很容易理解
下面是**實現,注釋已經很清楚了
/// 堆排序-整理堆
void buildheap(int a, int index, int size)
// 待比較的父節點比葉子大則跳出
if (value > a[i])
// 父和葉子交換位置
swap(a[index], a[i]);
// 重排葉子
index = i;}}
/// 堆排序
void heapsort(int a, int size)
// 頭尾交換,最值放到最後面的有序區,然後對其它無序區重構樹
for (int i = size - 1; i >= 0; i--)
}void main()
;heapsort(a, sizeof(a) / sizeof(a[0]));
}
markdown編輯器連顏色都不能變啊。。。 堆排序基礎
首先,推薦大家去看下 演算法導論 那是演算法聖經,講得非常詳細,本文中的 大部分是將其中的偽 用c c 實現出來 雖然書上有堆排序 heapsort 的概念的詳細解釋,網路上介紹堆排序的講解也基本都有描述,我這還是將一些基本概念寫出來 堆 二叉 堆資料結構是一種陣列物件,可以被視為一棵完全二叉樹,樹...
C 演算法基礎之排序 堆排序
今天,大白跟大家玩玩堆排序。基本思想 堆排序是利用堆 大根堆或者小根堆 的特點進行排序。啪啦啪啦一大堆。以建最小堆為例 簡言之,就是將無序區看成乙個完全二叉樹,利用完全二叉樹用陣列儲存是的特點,進行排序。建堆 從序列的末尾開始,先找出孩子中的較小值,然後和雙親比較,如果小於雙親,則交換位置。排序 進...
演算法基礎 排序 堆排序
headsort2 是我自己想的,感覺這麼寫可以。驗證是ok的。區別等我問問。import com.alibaba.fastjson.json author wangtb date 2019 09 29 23 02 public class heapsort heapsort arr heapsor...