数据结构与算法(C#实现)系列---二叉堆(数组实现)

原创 2004年02月13日 11:21:00

           数据结构与算法(C#实现)系列---二叉堆(数组实现)

using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.Collections;

 

namespace DataStructure

{

     /// <summary>

     /// BinaryHeap 的摘要说明。-------二叉堆(基于数组的实现)

     /// </summary>

     public class BinaryHeap:IPriorityQueue

     {

         protected ArrayList array;

         //建立一个最多容纳_length个对象的空二叉堆

         public BinaryHeap(uint _length)

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

              array=new ArrayList((int)_length);

              array.Capacity=(int)_length;

             

         }

         //堆中对象个数

         public virtual int Count{get{return this.array.Count;}}

         //将成员数组变成用1为基数表达的形式

         public virtual object Item(int _i)

         {

              if(_i>=this.array.Capacity)

                   throw new Exception("My:out of index");//不能出界

              return this.array[_i-1];

         }

         #region IPriorityQueue 成员

 

         //先将空洞放在数组的下一个位置上,也就是i(注:基数是1),然后和[i/2]位置上的数比较,如果小于则将空洞上移到[i/2]位置,而原先[i/2]位置上的对象则移到[i]上,否则就将空洞变为_obj----如此递归

         public void Enqueue(Object _obj)

         {

              // TODO:  添加 BinaryHeap.Enqueue 实现

              if( this.array.Count==this.array.Capacity )

                   throw new Exception("My:priority queue is full");//如果优先队列已满,则抛出异常

              this.array.Add(new object());

              int i=this.array.Count;

              while(i>1&&Comparer.Default.Compare(this.array[i/2-1],_obj  )>0)

              {

                   //this.Item(i)=this.Item(i/2);

                   this.array[i-1]=this.array[i/2-1];

                   i/=2;

              }

              this.array[i-1]=_obj;

         }

 

         public object FindMin()

         {

              // TODO:  添加 BinaryHeap.FindMin 实现

              if( this.array.Count==0 )

                   throw new Exception("My:priority queue is empty");//如果队列是空的,则抛出异常

              return this.array[0];

         }

 

         public object DequeueMin()

         {

              // TODO:  添加 BinaryHeap.DequeueMin 实现

              object tmpObj=this.FindMin();

              int i=1;

              while( (2*i+1)<=this.array.Count)

              {

                   if( Comparer.Default.Compare(this.array[2*i-1],this.array[2*i])<=0 )

                   {

                       this.array[i-1]=this.array[2*i-1];

                       this.array[2*i-1]=tmpObj;

                       i=2*i;

                   }

                   else

                   {

                       this.array[i-1]=this.array[2*i];

                       this.array[2*i]=tmpObj;

                       i=2*i+1;

                   }

              }

              object delObj=this.array[i-1];//暂时储存要删去的元素

              if(i!=this.array.Count)//如果搜索到的对象就是数组的最后一个对象,则什么都不要做

              {

                   this.array[i-1]=this.array[this.array.Count-1];//添补空洞

              }

              this.array.RemoveAt(this.array.Count-1);//将最后一个对象删除

 

              return delObj;

        

         }

 

         #endregion

     }

}

 

数据结构基础 之 二叉堆实现堆排序

堆实际上是一棵完全二叉树,也称二叉堆。本文首先对二叉堆的定义和相关概念给予阐述并针对堆排序图例给出算法单步演示,而后给出二叉堆以及堆排序的代码实现,文末结合实际代码实现给出算法要点分析。...
  • u013630349
  • u013630349
  • 2015年07月16日 09:41
  • 973

数据结构与算法——二叉堆

二叉堆(也叫做堆):本次实现的是最小堆,也就是树的根结点的值是最小的。如果树的根结点的值是最大的,那么该堆是最大堆。...
  • Linux_ever
  • Linux_ever
  • 2016年01月09日 17:40
  • 1151

数据结构与算法(C#实现)---二叉堆(数组实现)

using System;using System.Collections;namespace DataStructure{    ///     /// BinaryHeap 的摘要说明。-----...
  • iltaek
  • iltaek
  • 2009年07月28日 19:54
  • 284

java 使用二叉堆实现 TopK 算法

首先 本小白是参考这里写链接内容 和这里写链接内容 两位 博主的文章 1.首先,什么是二叉堆,维基百科上是这么描述的: 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键...
  • bcmbcmbcm
  • bcmbcmbcm
  • 2017年05月26日 20:19
  • 585

数据结构与算法系列----Sunday算法详解

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。Sunday算法的思想和BM算法中的坏字符思想非常类似。差别只是在于Sunday算法在失配之后,是取目标串中当前和模式...
  • LaoJiu_
  • LaoJiu_
  • 2016年02月29日 19:38
  • 5276

数据结构 二叉堆 数组实现

堆还是比较常用的数据结构 二叉堆也就是以二叉树形式构造的堆 我们知道二叉树可以用数组很方便的实现 所以用数组实现二叉堆也不是很难的事情 首先我们来了解一下二叉堆的性质:非叶子节点的值均不大于(...
  • hello42
  • hello42
  • 2013年05月10日 15:34
  • 551

【数据结构与算法】c# Dictionary内部实现

新手:习惯、激情、方向 组建知识网,前期不在乎得失和性价比 Dictionary咋用的? Dictionary dic = new Dictionary(); ...
  • TW_345
  • TW_345
  • 2017年03月13日 21:12
  • 1134

数据结构二叉堆C++实现 最小堆

#include #include #include #include using namespace std; template class BinaryHeap { public: ...
  • a363344923
  • a363344923
  • 2014年12月07日 15:38
  • 660

C#实现优先队列 基于二叉堆 附使用案例

前言 想用下C#的优先队列,结果发现居然没有,简直蛋疼。。。 感谢 http://www.cnblogs.com/skyivben/archive/2009/04/18/1438731.html 博主...
  • luke2834
  • luke2834
  • 2016年04月14日 19:26
  • 599

数据结构—堆的学习:堆化数组、堆的插入、堆的删除

原网页:http://blog.csdn.net/morewindows/article/details/6709644 程序如下: //数据结构堆的创建(堆化数组)、堆的插入和删除 #inclu...
  • u012258911
  • u012258911
  • 2015年08月28日 15:58
  • 1195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法(C#实现)系列---二叉堆(数组实现)
举报原因:
原因补充:

(最多只允许输入30个字)