C語言實現堆排序

2021-09-25 20:29:28 字數 2228 閱讀 2301

堆排序在初學時對我來說也是比較難掌握的一種排序方法,大頂堆、小頂堆的定義能搞明白就不錯了,演算法在初學的時候基本是自己寫不出來的。現在回過頭來看一看演算法描述,發現其實也不難理解,甚至還能看出來書中演算法描述的小瑕疵,不過還是要記錄一下,難免會忘記。

將初始待排序關鍵字序列(r1,r2…rn)構建成大頂堆,此堆為初始的無序區

將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,…rn-1)和新的有序區(rn)

由於交換後新的堆頂r[1]可能違反堆的性質,因此需要對當前無序區(r1,r2,…rn-1)調整為新堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2…rn-2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成

實現堆排序需要解決兩個問題:

如何將n個元素的序列按關鍵碼建成堆。

輸出堆頂元素後,怎麼調整剩餘n-1個元素,使其按關鍵碼成為乙個新堆。

#include

#include

#include

const

int maxsize =

100;

void

heap_sort

(int*,

int)

;void

heap_adjust

(int*,

int,

int)

;int

main()

for(

int i=

0;i<

20;i++

)printf

("\n");

heap_sort

(data,20)

;for

(int i=

0;i<

20;i++

)printf

("\n");

return0;

}/**

* 堆排序

* @param:len 陣列的長度

* */

void

heap_sort

(int

*data,

int len)

// 將陣列第乙個元素與最後乙個元素交換位置,然後在調整大根堆

int tmp;

for(

int i = len -

1; i >

0;i --)}

/** * 調整成大根堆

* * @param: data 陣列中第乙個元素的首位址

* @param: left 調整大根堆時的根節點的下標

* @param: right 調整大根堆時的最後乙個元素的下標

*/void

heap_adjust

(int

*data,

int left,

int right)

data[left]

= tmp;

}

效率分析:

設樹高為k,k=⌊

log⁡2n

⌋+

1k=\big\lfloor\log_2n\big\rfloor+1

k=⌊log2​

n⌋+1

。從根節點到葉子節點的篩選,關鍵碼比較的次數最多為2(k-1)次,交換記錄最多為k次。所以在建好堆後,排序過程的刪選次數不超過下式:

2 (⌊

log⁡2(

n−1)

⌋+

⌊log⁡2

(n−2

)⌋+.

..+⌊

log⁡22

⌋)

<2n

log⁡2n

2(\big\lfloor\log_2(n-1)\big\rfloor+\big\lfloor\log_2(n-2)\big\rfloor+...+\big\lfloor\log_22\big\rfloor)<2n\log_2n

2(⌊log2​

(n−1

)⌋+⌊

log2​(

n−2)

⌋+..

.+⌊log2​

2⌋)<2n

log2​n

而建堆時的比較次數不超過4n次,因此,堆排序在最壞情況下時間複雜度為o(n

log⁡2n

)o(n\log_2n)

o(nlog2​

n)。空間複雜度為o(1

)o(1)

o(1)

。堆排序屬於不穩定的排序方法。

C語言實現堆排序

一 堆排序的原理。堆排序是利用堆的性質進行的一種選擇排序。堆實際上是一顆完全二叉樹,其中任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 或 key i key 2i 1 key i key 2i 任何一非葉節點的關鍵字不大於或者不小於其左右孩子。二 堆排序的思想。利用...

堆排序 c語言實現

演算法特點 1.不穩定排序 2.只能用於順序結構,不能用於鏈式結構 3.初始建堆所需比較次數較多,因此記錄數較少不宜採用。堆排序在最壞情況下時間複雜度為o nlogn 相對於快速排序的o n n 而言是乙個優點,當記錄比較多時較為高效。include include using namespace ...

c語言 實現堆排序演算法

今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...