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 向下...