堆排序(非遞迴版) c語言實現

2021-07-04 14:36:57 字數 1009 閱讀 6581

堆,是在邏輯上模仿完全二叉樹的一維陣列,(假設陣列開始下標為0)某父節點 i 其左右孩子可以表示為2*i+1(左)和2*i+2(右).

堆排序的思想是每次從堆頂拿出乙個元素(最大或最小取決於是大頂堆還是小頂堆)放入已排序陣列,然後將堆最後乙個元素插入堆頂,

這樣將引起堆的不平衡,然後重新調整堆至平衡,重複做下去。注意,每次拿出堆頂元素堆的大小都會減小1.

關於堆的複雜度:

排序演算法

平均時間複雜度

最壞時間複雜度

最好時間複雜度

空間複雜度

穩定性複雜性

堆排序o(nlgn)

o(nlgn)

o(nlgn)

o(1)

不穩定較複雜

#include #include #define size 10 /*陣列大小*/

#define lchild(i) (2*i+1) /*陣列起始下標為0,其左孩子為2*i+1 */

#define swap(a,b) /*兩個元素交換*/

/*調整堆平衡的函式*/

void heap_adjust(int *arr,int start,int end)

/*孩子比父親大,孩子上位取代父親*/

arr[start] = arr[i];

/*以孩子的位置進行下一次調整*/

start = i;

}/*插入最開始引起堆不平衡的元素*/

arr[start] = temp;

}/*堆排序主程式*/

void heap_sort(int *arr,int n)

/*堆排序。每次將堆頂元素與堆的最後乙個葉子節點交換

*交換後堆不平衡,重新調整堆,每交換一次,要調整堆

*的大小減小乙個

*/for(i=n -1;i > 0;i--)

}int main()

; heap_sort(arr,size);

int i;

for(i = 0;i

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 ...