堆排序的改進 多叉堆,C語言實現

2021-10-08 15:32:14 字數 1749 閱讀 1683

下面我們對不同的m (子節點個數) 和n (待排序的元素個數) 進行畫圖 (用python畫圖)。從下圖我們可以清晰的看到: 當資料量n很小時,不論m是多少,sum的值都差不多,且增長很快。當n ≥ 10000時,sum的增長變得非常緩慢。而這時不同的m之間有較大差別。m為3或4時sum非常接近,當m = 4時sum有最小值。當m ≥ 4時,隨著m的增大,sum逐漸增大,當m = 8時,效率與m = 2時相同 (兩條曲線完全重合)。從這個圖我們得到的結論是:四叉堆的效率最高。四叉堆的效率比二叉堆高20%。當資料量較小時,無論是m是多少,執行效率都差不多。當資料量很大時,才能體現出較大的差距。

注:這裡分析的是堆的效率,而不是堆排序的效率。其中四叉堆的效率最高。這些堆都可以用於堆排序,也可以用於其它演算法。

下面我們就利用m叉堆實現堆排序演算法。m叉堆與二叉堆的**非常相似:

#include

#include

#include

int size =0;

int arr[

10000000];

//對5000000個資料進行排序

int sonnum =3;

//子結點個數,4的時候效率最高

intgetrandom

(int m)

//獲得乙個隨機數

intswap

(int a,

int b)

//引數是father的index。根據指定的sonnum個子節點進行計算每個子節點的下標

intgetmaxindex

(int father)

}return maxindex;

//返回最大值的編號

}//向下調整。i是父節點的編號

void

shiftdown

(int i)

else

//符合堆的定義時,退出迴圈 }}

//建立大頂堆

void

createmaxheap()

}void

heapsort()

size = size2;

//恢復size

}int

main()

time_t t1, t2;

//分別宣告兩種使用方式的賦值物件

t1 =

time(0

);heapsort()

;//堆排序

t2 =

time(0

);printf

(, sonnum, t2 - t1)

;return0;

}

測試結果:

100萬個資料進行排序時,四叉堆消耗的時間比二叉堆少25%,但兩者僅僅相差1秒鐘。當資料量增加到5000萬時,四叉堆消耗的時間比二叉堆少44%。

結論:四叉堆的理論效能比二叉堆高20%,但是在較小規模的資料量時,兩者區別不大。當資料量非常大 (>100萬個資料) 時,四叉堆才能體現出比較明顯的優勢。

C語言實現堆排序

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

C語言實現堆排序

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

堆排序 c語言實現

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