1.堆是什麼?
堆是一種特殊的完全二叉樹.
其中, 堆又分為最大堆和最小堆.
最大堆: 任一父節點的值都比左右節點的值大.
最小堆: 任一父節點的值都比左右節點的值小.
2. 堆排序的過程:
a. 最小堆公升序排序: (最大堆降序排序類似)
建立最小堆->儲存根節點的值(或輸出)
->把最後乙個節點的值儲存到根節點
->堆長減 1->調整為最小堆.以此迴圈.
更好的方法:
b. 最大堆公升序排序:(最小堆降序排序類似)
建立最大堆->儲存根節點的值->交換根節點和最後乙個節點的值
-> 堆長度減1-> 調整.以此迴圈.
a:
void delete_root_and_sort(int
*heap_array, int len)
printf("\n");
}
b:
void max_delete_root_and_sort(int
*heap_array, int len)
for (i = 1; i < len + 1; i++)
printf("\n");
}
向下調整:
進行向下調整的時候, 先比較兩次再進行一次交換比每進行一次比較交換一次好.
下面**中的father = min; 這句十分關鍵.flag標誌是為了看是否需要繼續調整. 因為調整是從最後乙個父節點開始, 是乙個從下往上的過程(此處腦袋浮現完全二叉樹) , 所以如果上層不需要調整, 下層也不再需要(因為已經調整過了).
**如下:
static void siftdown(int *heap_array, int father, int len)
else
}if (right_child <= len)
}if (min != father)
else
}}
注意: 把堆資料放在陣列的第[1]位開始會更方便.
原始碼:
勿在浮沙築高台.
建堆 堆排序
我們前面已經了解過什麼是堆,現在我們來根據它的特徵來研究如何建乙個堆。初始化,申請空間,給堆賦值 建立堆的結構體 typedef struct heap heap 初始化堆 void initheap heap hp,datatype array,int size hp capacity size ...
二叉堆 堆排序
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...
二叉堆 堆排序
推薦 某cppblog wutianqi sblog 堆排序實現 include using namespace std 輸出當前堆的排序狀況 void printarray int data,int size 建堆 自底而上地呼叫maxheapify來將乙個陣列a 1.size 變成乙個最大堆 注...