堆排序:
首先把資料構當作完全二叉樹,然後保證根點最大,然後把根結點與最後乙個元素交換,然後再調整二叉樹(逐漸減少陣列),讓根依然保持最大,重複上次操作。
所以必須先使用遞迴產生乙個根節點從上而下必須大於子節點或者小於子節點的樹,這樣才能保證根節點是最大或者最小的乙個葉子節點,將將這個節點與根節點交換,將這個根節點放進陣列中,將陣列長度減1,再次呼叫,呼叫n次,n為陣列長度``
void creat_heap(int* arr,size_t root,size_t len)
if(right < len)
if(max != root)
swap(arr[max],arr[root]);
}void heap_sort(int* arr,size_t len)
{for(int i=0; ivoid creat_heap(int* arr,size_t root,size_t len);遞迴的主體函式產生乙個根節點會比子節點大的樹
void heap_sort(int* arr,size_t len);對上面的函式呼叫len此,len為陣列長度,並將陣列長度減1後再次放入void creat_heap(int* arr,size_t root,size_t len);中呼叫將其中最大的數再次放入,最終產生乙個公升序陣列
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 ...