C 最大堆實現

2021-10-06 10:24:07 字數 2860 閱讀 3601

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