STL之heap实现

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值