①定義
最大堆:對於任意二叉樹節點,左右孩子節點的值都小於父親節點的值。即根節點的值最大
最小堆:同理
②最大(小)堆的建立
接下來演示最小堆的建立,最大堆同理
堆的結構體如下:(由結構體可以看出,該樹是由陣列來進行儲存樹)
typedef
struct node *heap;
struct node
;
建立乙個空的堆:
heap create_empty_heap
(int n)
向最小堆中插入元素:
步驟:1.首先將size+1,並且直接將該元素直接插到最後乙個節點,即完全二叉樹2.然後以此和父節點進行比較,若該節點比父節點小,則直接交換位置
void
insert
(heap h,
int x)
h->data[i]
= x;
}
獲取當前最小堆中最小元素,即根節點元素,data[1]
操作步驟:1.返回值就是直接返回根節點元素
2.然後將最後乙個節點元素,即data[h->size] 預設放到根節點
3.然後維護該最小堆,從根節點parent = 1,向下找兩個兒子child節點中最小的節點
4.將該根節點值與兩個兒子結點的值進行比較,如比兩個兒子節點的值都大,則完成最小堆排序
否則,將該根節點與兒子節點交換位置,在迴圈該兒子節點為根節點進行排序最小堆
int
delete_minheap
(heap h)
h->data[parent]
= x;
return ans;
}
③堆排序
堆排序的時間複雜度為nlogn ,因為遍歷n個節點,每次獲取最小值的時間複雜度為logn(原因是每次獲取最小值後,重構最小堆的時間複雜度為logn,即為樹的深度)
下面為堆排序的演示**:
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
struct node *heap;
struct node
;heap create_empty_heap
(int n)
void
insert
(heap h,
int x)
h->data[i]
= x;
}int
delete_minheap
(heap h)
h->data[parent]
= x;
return ans;
}int
main()
for(
int i =
1; i<=n; i++
)return0;
}
最小堆的建立 插入 與刪除
堆是完全二叉樹,完全二叉樹最大的特點就是 把資料儲存在陣列裡 通過父子結點的關係來做 不用實際建樹 parent leftchild 2 leftchild 2 parent 右就加1這兒指的是序號關係,儲存的時候注意是利用樹的邏輯圖 從上到下 從左到右編號12345.建堆 實際是把資料先放入陣列 ...
堆的建立 插入與刪除
堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時 如果i 0,節點i是根節點 否則節點i的父節點為節點 i 1 2 如果2i 1 n 1,則節點i無左子女 否則節點i的左子女為2i 1 如果2i 2 n 1,則節點i無右子女 否則節點i的右子女為2i 2 typede...
資料結構 大小堆的理解,建立,增加和刪除元素操作
大小堆是基於完全二叉樹的結構 大堆 任意乙個結點的左右孩子的資料都小於此結點的資料,位於堆頂的結點的資料最大。小堆 任意乙個結點的左右孩子的資料都大於此結點的資料,位於堆頂的結點的資料最小。下面以小堆為例,以下都是以小堆為例 首先我們只會得到乙個陣列,並且我們知道堆最終形態是完全二叉樹。通過遞迴的思...