《数据结构实战》------------------------ 一个二叉堆的实现
来源:互联网 发布:淘宝怎么设置新品上架 编辑:程序博客网 时间:2024/06/06 06:34
该代码是一个二叉堆的实现,堆排序。
#ifndef __CBINARYHEAP__H#define __CBINARYHEAP__H#include <iostream>#include <vector>// 小根堆的实现// 没有值的节点填充为-9999class 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;}
阅读全文
0 0
- 《数据结构实战》------------------------ 一个二叉堆的实现
- 数据结构实战java实现二叉堆
- 数据结构 二叉堆 数组实现
- 数据结构二叉堆C++实现 最小堆
- 实现一个简单的最大二叉堆和堆排序
- 数据结构与算法分析-二叉堆的实现
- 用c++实现二叉树及堆的数据结构
- 二叉堆的实现
- 二叉堆的实现
- 二叉堆的实现
- 二叉堆的实现
- 数据结构堆的实现
- 数据结构-堆的实现
- 自己实现一个简单的优先队列-二叉堆
- 数据结构实战java实现二叉查找树
- 数据结构基础 之 二叉堆实现堆排序
- 小白学数据结构——二、树与堆(基本概念及二叉树、二叉堆的python实现)
- C++二叉堆的实现
- pycharm工程启动卡住没反应
- 初识多线程
- Web移动端布局的那些事儿
- supervise系统进程监控
- ARP协议在同网段及跨网段下的工作原理
- 《数据结构实战》------------------------ 一个二叉堆的实现
- LCA
- Android SeekBar(拖动条)
- 加载配置文件
- redis学习 基础篇(二) php操作redis
- 【学习大作战】Intent和Intent-filter详解
- iOS Hacker dumpdecrypted脱壳
- Zend Studio 12.0.1 汉化方法及破解文件
- OtterTune来了,DBA怎么办