C 基礎 堆排序

2021-06-29 08:33:20 字數 1011 閱讀 7178

首先呢,希望學習堆排序的各位千萬不要以為這個演算法有多麼的難,可以理解為「構造樹」。

堆排序的過程就是構造樹的過程。

這裡先指明三個公式:

假設當前節點下標為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...