堆 堆排序學習總結

2021-07-10 19:09:08 字數 1164 閱讀 4215

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 變成乙個最大堆 注...