程式設計珠璣讀書筆記 堆排序,小根堆

2021-08-26 17:23:34 字數 1209 閱讀 7368

堆排序的關鍵是要實現siftup和siftdown。當建立完這兩個函式以後,排序乙個陣列只需要5行**。演算法執行了n-1次siftup和siftdown,而每次操作的成本最多o(lgn),所以執行時間為o(nlogn)。

#include #include #define max 20 void swap( int *data, int i, int j) //siftup比較好理解,將每乙個元素都與自己的父親比較,如果自己的值小於父親的值,就互換,直到到堆頂,或父親的值小於自己的值為止。 void siftup(int *data, int n ) } //這裡的n其實意義不大,是指n之後的資料是符合要求的,n之前的資料可能不滿足小根堆的要求,調整的方法也是從堆頂開始,初步向小調整 void siftdown( int *data, int n) } int main() for( i = 1; i < max; i++ ) printf("%d\t", data[i]); printf("\n"); return 0; }

堆排序與系統排序的效率比較:

#include #include#include#include #include using namespace std; #define max 200000 void swap( int *data, int i, int j) //siftup比較好理解,將每乙個元素都與自己的父親比較,如果自己的值小於父親的值,就互換,直到到堆頂,或父親的值小於自己的值為止。 void siftup(int *data, int n ) } //這裡的n其實意義不大,是指n之後的資料是符合要求的,n之前的資料可能不滿足小根堆的要求,調整的方法也是從堆頂開始,初步向小調整 void siftdown( int *data, int n) } int main() endtime = clock(); printf("heapsort:%gms\n", (endtime - begtime) / 1000); begtime = clock(); sort(data2, data2 + max + 1); endtime = clock(); printf("sort: %gms\n", (endtime - begtime) / 1000); printf("\n"); return 0; }

測試結果如下:

heapsort:60ms

sort: 40ms

結果表明,堆排序確實有著相當不錯的表現,不到必須的時候,還是應當使用系統的sort函式,效率很高,且節約開發成本。

程式設計珠璣 讀書筆記 堆的實現及堆排序

堆是用來表示元素集合的一種資料結構。與 堆記憶體 不同。堆的性質,第一 順序性 任何結點的值都小於或者等於其子結點的值,這意味著最小元素位於根結點。最大頂堆跟這個相反。第二個性質是形狀 一種二叉樹,最底層的葉子結點盡可能靠左分布,如果有n個結點,那麼所有結點到根的距離不會超過logn。下面用vect...

程式設計珠璣 讀書筆記 堆的實現及堆排序

堆是用來表示元素集合的一種資料結構。與 堆記憶體 不同。堆的性質,第一 順序性 任何結點的值都小於或者等於其子結點的值,這意味著最小元素位於根結點。最大頂堆跟這個相反。第二個性質是形狀 一種二叉樹,最底層的葉子結點盡可能靠左分布,如果有n個結點,那麼所有結點到根的距離不會超過logn。下面用vect...

堆排序(大根堆 小根堆)

堆 堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 ke...