C 最小堆實現

2021-10-06 10:24:07 字數 2884 閱讀 8253

mini_heap.h

#pragma once

#include template class mini_heap ;

node* _heap; //最小堆

uint32_t _max_size; //最大儲存數

uint32_t _size; //儲存數

// 擴容

void expansion();

// 刪除指定下標節點

void del_node(uint32_t index_);

protected:

public:

mini_heap(uint32_t max_size_ = 64);

~mini_heap();

// 首元素

const node* begin();

// 末尾元素後一位

const node* end();

// 獲取最小值

const node* front();

// 新增資料

void push(uint32_t size_, t* data_);

// 刪除最小值

t* pop();

// 刪除指定值

t* del(uint32_t size_);

// 查詢指定值

t* find(uint32_t size_);

// 是否空

bool empty();

// 清空

void clear();

// 大小

uint32_t size();

};#include "mini_heap.tcc"

mini_heap.tcc

template mini_heap::mini_heap(uint32_t max_size_) :

_heap(new node[max_size_]{}),

_max_size(max_size_),

_size(0)

{}template mini_heap::~mini_heap()

template void mini_heap::expansion() ;

memcpy_s(new_heap, size << 1, _heap, size);

delete _heap;

_heap = new_heap;

}template void mini_heap::del_node(uint32_t index_)

// 向下調整

if (_heap[_size].size > _heap[index_].size)

if (_heap[_size].size > _heap[index2].size)

else

} _heap[index1] = _heap[_size];

memset(&_heap[_size], 0, sizeof(node));

} // 向上調整

else if (_heap[_size].size < _heap[index_].size)

_heap[index_] = _heap[_size];

memset(&_heap[_size], 0, sizeof(node));

} // 不做調整

else

_size -= 1;

}template inline const typename mini_heap::node* mini_heap::begin()

template inline const typename mini_heap::node* mini_heap::end()

template inline const typename mini_heap::node* mini_heap::front()

return _heap + 1;

}template void mini_heap::push(uint32_t size_, t* data_)

if (++_size == _max_size)

_heap[_size].size = size_;

_heap[_size].data = data_;

uint32_t index1 = _size, index2 = index1 >> 1;

while (index1 > 1 && _heap[index2].size > _heap[index1].size)

}template inline t* mini_heap::pop()

t* data = _heap[1].data;

del_node(1);

return data;

}template t* mini_heap::del(uint32_t size_)

// push了key值相同的複數資料可能不是想要的結果

uint32_t index1 = 0;

for (uint32_t i = 1; i <= _size; ++i)

} if (index1)

return nullptr;

}template t* mini_heap::find(uint32_t size_)

} if (!index1)

return _heap[index1].data;

}template inline bool mini_heap::empty()

template inline void mini_heap::clear()

}template inline uint32_t mini_heap::size()

備註:如果是push公升序資料的話比push降序資料快得多

可以使用for(auto& i : ***)語法進行遍歷

C 實現最小堆(binary heap)

閒來無事,用c 實現了最小堆。用到了模板類泛型程式設計,用陣列實現的最小堆。binheap.h中的宣告 templateclass binheap 其中capacity是堆的容量,在數值上等於count 1,因為堆的根從陣列elements 1 開始,elements 0 留著,用作標記。下面是全部...

最小堆的實現

這邊實現的是最小堆,最小堆是這樣定義的,首先堆是一棵完全二叉樹,每乙個節點都有乙個權值,滿足的條件是,父節點的權值總是大於等於子節點的權值 include using namespace std 最小堆類的定義如下 template class minheap template void minhe...

最小堆 C 模板

本人對最小堆的理解,相關注釋在 中 include using namespace std const int maxn 10000000 int h maxn 用乙個一維陣列模擬最小堆,父節點的的值小於子節點的值 int n 用來記錄堆的元素的個數 void swap int x,int y 向下...