max_heap.h
#pragma once
#include template class max_heap ;
node* _heap; //最大堆
uint32_t _max_size; //最大儲存數
uint32_t _size; //儲存數
// 擴容
void expansion();
// 刪除指定下標節點
void del_node(uint32_t index_);
protected:
public:
max_heap(uint32_t max_size_ = 64);
~max_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 "max_heap.tcc"
max_heap.tcc
template max_heap::max_heap(uint32_t max_size_) :
_heap(new node[max_size_]{}),
_max_size(max_size_),
_size(0)
{}template max_heap::~max_heap()
template void max_heap::expansion() ;
memcpy_s(new_heap, size << 1, _heap, size);
delete _heap;
_heap = new_heap;
}template void max_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 max_heap::node* max_heap::begin()
template inline const typename max_heap::node* max_heap::end()
template inline const typename max_heap::node* max_heap::front()
return _heap + 1;
}template void max_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* max_heap::pop()
t* data = _heap[1].data;
del_node(1);
return data;
}template t* max_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* max_heap::find(uint32_t size_)
} if (!index1)
return _heap[index1].data;
}template inline bool max_heap::empty()
template inline void max_heap::clear()
}template inline uint32_t max_heap::size()
備註:如果是push降序資料的話比push公升序資料快得多。
可以使用for(auto& i : ***)語法進行遍歷
c 最大堆的實現
在看一些開源元件的原始碼時,會發現很多的底層地方都會使用到最大堆 最小堆 的資料結構,如 在libevent中維護超時事件就用到了最小堆的結構,可見,這種資料結構的重要性。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。堆,最重要的乙個過程就是重建的過程,...
c 最大堆的演算法實現
堆的資料結構是一種陣列,也可以說堆是一種有個性的陣列,他可以被視為一顆完全二叉樹 也有可能是滿二叉樹 任一節點的值均大於等於他左右孩子節點的值,其中堆頂的值最大 根節點 左孩子節點 2 父節點 1 右孩子節點 2 父節點 2 父節點 孩子節點 1 2 堆的應用場景 從很多個數中找出最大的前k個數 最...
最大堆實現,python
堆 heap class maxheap 索引0不用,所以陣列大小應該是 n 1 左節點2i 右節點2i 1,父節點 i 2 def init self self.data 堆陣列容量不知道 self.count len self.data def size self return self.cou...