下面我們對不同的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 ...