最小堆
来源:互联网 发布:2017php工程师面试题 编辑:程序博客网 时间:2024/05/12 23:36
先贴代码,再讲述自己的理解
#include<iostream>using namespace std;#define defaultSize 30class MinHeap{private:int *heap;//存储数据int currentSize;//当前可存入数据的位置int maxSize;//可存储的数据的个数void FilterUp(int start);void SiftDown(int start,int m);public:bool IsFull();bool IsEmpty();MinHeap(int heapSize=defaultSize);void printHeap();bool insert(int x);bool removeMin(int& x);int getSize();void SortHeap();};cpp:
#include"MinHeap.h"/************************************************************************//* 初始化对象 *//************************************************************************/MinHeap::MinHeap(int heapSize/* =defaultSize */){maxSize=heapSize;currentSize=0;heap=new int[maxSize];}/************************************************************************//* 判断是否为空堆 *//************************************************************************/bool MinHeap::IsEmpty(){return (currentSize==0)?true:false;}/************************************************************************//* 判断堆是否已经满了 *//************************************************************************/bool MinHeap::IsFull(){return (currentSize==maxSize)?true:false;}/************************************************************************//* 获取堆的大小 *//************************************************************************/int MinHeap::getSize(){return currentSize-1;}/************************************************************************//* 从一个位置向上调整堆 *//************************************************************************/void MinHeap::FilterUp(int start){int j=start;int i=(j-1)/2;int temp=heap[j];while(j>0){if(temp>=heap[i])//如果父亲节点小于等于子节点{break;}else{heap[j]=heap[i];j=i;i=(j-1)/2;//继续向上调整}}heap[j]=temp;}/************************************************************************//* 从一个位置向下调整到M的位置 *//************************************************************************/void MinHeap::SiftDown(int start,int m){int i=start;int j=i*2+1;int temp=heap[i];while(j<=m){if(j<m&&heap[j]>heap[j+1])//如果左孩子大于右孩子{j++;}if(temp<=heap[j]){break;}else{heap[i]=heap[j];i=j;j=i*2+1;//继续向下调整}}heap[i]=temp;}/************************************************************************//* 插入一个新的节点 *//************************************************************************/bool MinHeap::insert(int x){if(IsFull()){return false;}heap[currentSize]=x;FilterUp(currentSize);currentSize++;return true;}/************************************************************************//* 去除堆的顶点,即最小的数据 *//************************************************************************/bool MinHeap::removeMin(int& x){if(IsEmpty()){return false;}x=heap[0];heap[0]=heap[currentSize-1];currentSize--;SiftDown(0,currentSize-1);return true;}/************************************************************************//* 打印堆 *//************************************************************************/void MinHeap::printHeap(){for(int i=0;i<currentSize;i++){cout<<heap[i]<<endl;}}/************************************************************************//* 为堆进行排序,将堆顶数据和末尾数据进行条换,然后current--对堆从顶端进行调整重复以上动作,直到排序完成 *//************************************************************************/void MinHeap::SortHeap(){if(IsEmpty()){return;}for(int i=1;i<currentSize;i++){int temp=heap[0];heap[0]=heap[currentSize-i];heap[currentSize-i]=temp;SiftDown(0,currentSize-i-1);}}虽然是使用数组,但同样运用到树的概念。
heap[0] 就好比是一颗树的根节点,它的左右孩子分别为heap[1],heap[2]
对于任意一个位置i,它的左孩子是i*2+1,右孩子是i*2+2
插入一个数据后,从这个数据向上进行调整
删除堆顶后,将末尾数据放入堆顶,然后从堆顶向下调整
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最大堆/最小堆
- 最小堆。最大堆。
- 最大堆/最小堆
- 最大堆/最小堆
- 最大堆/最小堆
- Linux网络驱动程序编写
- STM32 RCC基本原理和配置流程
- Oracle dbca Exception in thread “main” 解决方法
- Android:保存图片到Sqlite数据库
- Nana:防止耗时处理导致界面的阻塞
- 最小堆
- android ViewFlipper的使用
- 【Django】Django命令(Manager.py)
- 关于Oracle进程结构及后台进程简介
- StarUML---推荐一款UML工具(很好很强大)
- 分析skb和网卡驱动的关系
- 语句插入中文数据时数据库显示全是问号???
- 在Outlook的联系人文件夹下能否创建同名联系人?
- Snmp学习笔记