该代码是一个二叉堆的实现,堆排序。
#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;
}