《数据结构实战》------------------------ 一个二叉堆的实现

该代码是一个二叉堆的实现,堆排序。

#ifndef __CBINARYHEAP__H
#define __CBINARYHEAP__H
#include <iostream>
#include <vector>

// 小根堆的实现
// 没有值的节点填充为-9999

class CBinaryHeap
{
public:
	CBinaryHeap(int nSize); // 初始大小
	~CBinaryHeap();

public:
	bool InsertNode(int nValue); // 插入数据
	bool DeleteMin(); // 删除最小值
	int  GetMin(); // 获取最小值
private:
	void Resize();
	void PullDown(int nIndex, int nLast); // 找到左右节点中更小的 并进行填充
private:
	int m_nSize;
	int m_nCurrentPos;
	std::vector<int> m_vectBinaryHeap;
};

#endif

#include "BinaryHeap.h"



CBinaryHeap::CBinaryHeap(int nSize) : m_nSize(nSize)
{
	m_vectBinaryHeap.resize(m_nSize);
	for (int i = 0; i < m_nSize; i++)
	{
		m_vectBinaryHeap[i] = -9999;
	}
	m_nCurrentPos = 0;
}


CBinaryHeap::~CBinaryHeap()
{
}

bool CBinaryHeap::InsertNode(int nValue)
{
	if (m_nCurrentPos == m_nSize) // 扩展
		Resize(); // 扩展大小
	m_nCurrentPos++; // 下一个节点肯定是空的
	int nHole = m_nCurrentPos;
	for (; nHole > 1 && nValue < m_vectBinaryHeap[nHole / 2]; nHole /= 2) // 小于
		m_vectBinaryHeap[nHole] = m_vectBinaryHeap[nHole / 2]; // 将父节点填充到该节点
	m_vectBinaryHeap[nHole] = nValue;
	return true;
}

void CBinaryHeap::Resize()
{
	std::vector<int> vectTemp;
	vectTemp.swap(m_vectBinaryHeap);
	m_vectBinaryHeap.resize(m_nSize * 2);
	m_vectBinaryHeap.swap(vectTemp);
	for (int i = m_nCurrentPos; i++; i < m_nSize * 2)
		m_vectBinaryHeap[i] = -9999;
	m_nSize *= 2;
}

int CBinaryHeap::GetMin()
{
	return m_vectBinaryHeap[1]; // 1处的元素是最小的
}

bool CBinaryHeap::DeleteMin() // 删除最小值
{
	int nLast = m_vectBinaryHeap[m_nCurrentPos--]; // 先找出最后一个元素 再进行填充
	PullDown(1, nLast);
	return true;
}

void CBinaryHeap::PullDown(int nIndex, int nLast)
{
	if (2 * nIndex > m_nSize || 2 * nIndex + 1 > m_nSize) // 没有左右节点
	{
		m_vectBinaryHeap[nIndex] = nLast;
		return;
	}
	if (m_vectBinaryHeap[2 * nIndex] == -9999 && m_vectBinaryHeap[2 * nIndex + 1] == -9999) // 没有左右节点
	{
		m_vectBinaryHeap[nIndex] = nLast;
		return;
	}
	if (m_vectBinaryHeap[2 * nIndex + 1] == -9999) // 没有右节点
	{
		m_vectBinaryHeap[nIndex] = m_vectBinaryHeap[2 * nIndex];
		m_vectBinaryHeap[2 * nIndex] = nLast;
		return;
	}
	m_vectBinaryHeap[nIndex] = (m_vectBinaryHeap[2 * nIndex] < m_vectBinaryHeap[2 * nIndex + 1]) ? m_vectBinaryHeap[2 * nIndex] : m_vectBinaryHeap[2 * nIndex + 1];
	bool bLeft = (m_vectBinaryHeap[2 * nIndex] < m_vectBinaryHeap[2 * nIndex + 1]) ? true : false;
	PullDown(bLeft ? 2 * nIndex : 2 * nIndex + 1, nLast);
}

#include "BinaryHeap.h"

int main()
{
	CBinaryHeap binaryHeap(100);
	binaryHeap.InsertNode(31);
	binaryHeap.InsertNode(13);
	binaryHeap.InsertNode(16);
	binaryHeap.InsertNode(32);
	binaryHeap.InsertNode(68);
	binaryHeap.InsertNode(19);
	binaryHeap.InsertNode(65);
	binaryHeap.InsertNode(26);
	binaryHeap.InsertNode(21);
	binaryHeap.InsertNode(24);

	binaryHeap.DeleteMin();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/li2818/article/details/72887467