#ifndef __HEAP_H
#define _HEAP_H
#include"iterator_traits.h"
template<class RandomAccessIterator>
inline void mypush_heap(RandomAccessIterator first, RandomAccessIterator last)
{
__push_heap_aux(first, last, distance_type(first), value_type(first));
}
template<class RandomAccessIterator,class Distance,class T>
inline void __push_heap_aux(RandomAccessIterator first, RandomAccessIterator last, Distance*, T*)
{
__push_heap(first, Distance((last - first) - 1), Distance(0), T(*(last - 1)));
}
template<class RandomAccessIterator,class Distance,class T>
inline void __push_heap(RandomAccessIterator first, Distance holeIndex, Distance topIndex, T value)
{
Distance parent = (holeIndex - 1) / 2;
while (holeIndex > topIndex&&*(first + parent) < value)
{
*(first + holeIndex) = *(first + parent);
holeIndex = parent;
parent = (holeIndex - 1) / 2;
}
*(first + holeIndex) = value;
}
template<class RandomAccessIterator,class Compare>
inline void mypush_heap(RandomAccessIterator first, RandomAccessIterator last,Compare comp)
{
__push_heap_aux(first, last, comp,distance_type(first), value_type(first));
}
template<class RandomAccessIterator, class Compare,class Distance, class T>
inline void __push_heap_aux(RandomAccessIterator first, RandomAccessIterator last, Compare comp,Distance*, T*)
{
__push_heap(first, Distance((last - first) - 1), Distance(0), T(*(last - 1)),comp);
}
template<class RandomAccessIterator, class Distance, class T,class Compare>
inline void __push_heap(RandomAccessIterator first, Distance holeIndex, Distance topIndex, T value,Compare comp)
{
Distance parent = (holeIndex - 1) / 2;
while (holeIndex > topIndex&&comp(*(first+parent),value))
{
*(first + holeIndex) = *(first + parent);
holeIndex = parent;
parent = (holeIndex - 1) / 2;
}
*(first + holeIndex) = value;
}
template<class RandomAccessIterator,class Compare>
inline void mypop_heap(RandomAccessIterator first, RandomAccessIterator last,Compare comp)
{
__pop_heap_aux(first, last, value_type(first),comp);
}
template<class RandomAccessIterator,class T,class Compare>
inline void __pop_heap_aux(RandomAccessIterator first, RandomAccessIterator last, T*,Compare comp)
{
__pop_heap(first, last - 1, last - 1, T(*(last - 1)),comp,distance_type(first));
}
template<class RandomAccessIterator,class Distance,class T,class Compare>
inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last, RandomAccessIterator result, T value, Compare comp ,Distance*)
{
*result = *first;
__adjust_heap(first, Distance(0), Distance(last - first), value,comp);
}
template<class RandomAccessIterator,class Distance,class T,class Compare>
inline void __adjust_heap(RandomAccessIterator first, Distance holeIndex, Distance len, T value,Compare comp)
{
Distance topIndex = holeIndex;
Distance secondChild = 2 * holeIndex + 2;
while (secondChild < len)
{
if (comp(*(first+secondChild),*(first+(secondChild-1))))
secondChild--;
*(first + holeIndex) = *(first + secondChild);
holeIndex = secondChild;
secondChild = 2 * (secondChild + 1);
}
if (secondChild == len)
{
*(first + holeIndex) = *(first + (secondChild - 1));
holeIndex = secondChild - 1;
}
__push_heap(first, holeIndex, topIndex, value);
}
template<class RandomAccessIterator>
inline void mymake_heap(RandomAccessIterator first, RandomAccessIterator last)
{
__make_heap(first, last, value_type(first), distance_type(first));
}
template<class RandomAccessIterator,class T,class Distance>
inline void __make_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Distance*)
{
if (last - first < 2)
return;
Distance len = last - first;
Distance parent = (len - 2) / 2;
while (true)
{
__adjust_heap(first, parent, len, T(*(first + parent)));
if (parent == 0)
return;
parent--;
}
}
template<class RandomAccessIterator,class Compare>
inline void mymake_heap(RandomAccessIterator first, RandomAccessIterator last,Compare comp)
{
__make_heap(first, last, comp,value_type(first), distance_type(first));
}
template<class RandomAccessIterator, class Compare, class T, class Distance>
inline void __make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp, T*, Distance*)
{
if (last - first < 2)
return;
Distance len = last - first;
Distance parent = (len - 2) / 2;
while (true)
{
__adjust_heap(first, parent, len, T(*(first + parent)),comp);
if (parent == 0)
return;
parent--;
}
}
template<class RandomAccessIterator,class Compare>
inline void mysort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
{
while (last - first > 1)
pop_heap(first, last--,comp);
}
#endif
STL之heap实现
最新推荐文章于 2021-10-29 18:08:19 发布