**:
#include
#include
#include
using namespace std;
#define default_capacity 128
//堆的生成
typedef struct _heap _heap;
//遍歷所有堆值
static void adjustdown(_heap &heap, int index)
//child是最大的子節點的下標
if (heap.arr[child] > cur)
else
}//建堆
static void buildheap(_heap &heap)
for (int i = (heap.size - 1 - 1) / 2; i >= 0; i--)
//初始化1
bool heapinit_1(_heap &heap, int *origal, int size)
//容量
int capacity = (default_capacity > size ? default_capacity : size);
heap.arr = (int*)(malloc(sizeof(int) * capacity));
if (!heap.arr)
//容量
heap.acpacity = capacity;
//元素預設為0
heap.size = 0;
//拷貝值
memcpy(heap.arr, origal, size * sizeof(int));
//設定元素值
heap.size = size;
//建堆
buildheap(heap);
return true;
//初始化2
bool heapinit_2(_heap &heap, int *origal, int size)
//容量
int capacity = (default_capacity > size ? default_capacity : size);
heap.arr = (int*)(malloc(sizeof(int) * capacity));
if (!heap.arr)
//容量
heap.acpacity = capacity;
//預設元素為0
heap.size = 0;
for (int i = 0; i < size; i++)
return true;
//向上遍歷
//插入的節點不能<0 在0節點插入是可以的,並且不能》=size
static void adjustup(_heap &heap, int index)
int cur = heap.arr[index];
int parent, child;
for (child = index; child > 0; child = parent)
else
}
//插入堆
//在最後插入
//插入的時候要判斷空間
bool insert(_heap &heap, int value)
//插入的節點下標值
int index = heap.size;
//值插入
heap.arr[heap.size++] = value;
//向上便利
adjustup(heap, index);
return true;
bool popmax(_heap &heap, int * p_value)
//把陣列第乙個數
*p_value = heap.arr[0];
//賦值最後乙個節點數
heap.arr[0] = heap.arr[--heap.size];
//再次從上面遍歷下去
//從0這個節點開始
//從上往下調整
adjustdown(heap, 0);
return true;
cout << "元素容量為:" << heap.acpacity << " 元素個數為:" << heap.size << endl;
for (int i = 0; i < heap.size; i++)
cout << endl;
int main(void) ;
int size = sizeof(origal) / sizeof(int);
if (!heapinit_2(heap, origal, size))
//輸出堆
printf("最大元素以此出列: \n");
while (popmax(heap, &value))
cout << endl;
system("pause");
return 0;
用陣列實現 堆 演算法
堆有大頂堆,小頂堆 大頂堆保證堆頂元素為堆中最大值,小頂堆相反。大頂 堆的特性是父節點的值大於子節點的值。對於堆來說 class heap array top return array 0 push while index 0 droptop exchage array 0 array size 1...
演算法入門 優先佇列實現 堆
優先佇列 priorityqueue 根據key值的大小將元素進行排序 先被pop的通常是優先順序最高的。此處介紹基於堆實現的優先佇列,binary heap是一種完全二叉樹,以大堆為例,每棵樹的根節點的key值一定大於其子孫節點的key值,完全二叉樹除了最底層的葉子節點外,其他位置都是填滿的。這樣...
堆的相關演算法
堆是一種特殊的二叉樹。它具有下面兩個性質 1 每乙個節點的值大於或等於其每乙個子節點的值。2 該樹全然平衡,最後一層的葉子都處於最左側的位置。有最大堆和最小堆之分。以上定義是最大堆的定義,最小堆的定義例如以下 1 每乙個節點的值小於或等於其每乙個子節點的值 2 該樹全然平衡,最後一層的葉子都處於最左...