堆的實現演算法

2021-10-04 06:25:19 字數 2575 閱讀 5585

**:

#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 該樹全然平衡,最後一層的葉子都處於最左...