溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【代碼】c++堆的簡單實現(xiàn)

發(fā)布時間:2020-07-01 15:50:06 來源:網(wǎng)絡(luò) 閱讀:498 作者:pawnsir 欄目:編程語言

    堆對象的創(chuàng)建與實現(xiàn)的核心思想就是上調(diào)(adjustup)與下調(diào)(adjustdown)的算法思想,上調(diào)用于創(chuàng)建堆時,從第一個非葉子節(jié)點開始向根節(jié)點根據(jù)需求調(diào)整為大堆或者小堆

    下調(diào)如圖示:

【代碼】c++堆的簡單實現(xiàn)

    當(dāng)我們進(jìn)行插入時,會影響堆的結(jié)構(gòu),這時我們用尾插,然后上調(diào)如圖示:

【代碼】c++堆的簡單實現(xiàn)

    接下來就可以創(chuàng)建堆類,代碼如下僅供參考:

#include<iostream>
#include<vector>
template <class T>
struct CompMax
{
	bool operator()(const T& a, const T& b)
	{
		return a > b;
	}
};
template <class T>
struct CompMin
{
	bool operator()(const T& a,const T& b)
	{
		return a < b;
	}
};

template <class T,class Com=CompMax<T> >//仿函數(shù)做模板參數(shù),可根據(jù)需求修改比較方法
class Heap
{
public:
	Heap(const T* arr, size_t size, Com _comp)
		:comp(_comp)
	{
		_List.resize(size);
		int index = 0;
		for (index = 0; index < size; ++index)
		{
			_List[index] = arr[index];
		}
		index = (_List.size()- 2) / 2;
		while (index>=0)
			_adjustdown(index--);

	}
	void Push(const T &x)
	{
		_List.push_back(x);
		size_t index = _List.size() - 1;
		_adjustup(index);
	}
	void Pop()
	{
		_List.pop_back();
	}
	T& Top()
	{
		return _List[0];
	}
protected:
	void _adjustup(size_t index)
	{
		size_t child = index;
		size_t parent = (child - 1) / 2;
		while (child)
		{
			if (child % 2)
			{
				if (child + 1<_List.size())
					child =comp(_List[child],_List[child+1]) ? child : child + 1;
			}
			else
			{
				child = comp(_List[child] ,_List[child - 1]) ? child : child - 1;
			}
			if (!comp(_List[child],_List[parent]))
			{
				std::swap(_List[parent], _List[child]);
			}
			child = parent;
			parent = (parent - 1) / 2;

		}
	}
	void _adjustdown(size_t index)
	{
		size_t parent = index;
		size_t child = parent * 2 + 1;
		while (child < _List.size())
		{
			if (child + 1 < _List.size())
				child = comp(_List[child] , _List[child + 1]) ? child : child + 1;
			if (!comp(_List[parent], _List[child]))
			{
				std::swap(_List[child], _List[parent]);
				parent = child;
				child = (parent + 1) * 2;
			}
			else
				break;
		}

	}
protected:
	vector<T> _List;
	Com comp;
};

    如有不足希望指正,如有問題也希望提出,謝謝-3-。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI