二叉堆(C#)
参考:http://www.cnblogs.com/skywang12345/p/3610390.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;
using System.Collections; namespace ConsoleApplication2
{
public class Program
{
public static void Main()
{
ShowMaxHeap();
ShowMinHeap();
Console.Read();
} private static void ShowMaxHeap()
{
int[] a = { , , , , , , , , , }; BinaryHeap<int> maxHeap = new BinaryHeap<int>((int1, int2) => int1.CompareTo(int2) > );//最大推 Console.Write("测试数据:");
for (int i = ; i < a.Length; i++)
{
Console.Write(string.Format("{0} ", a[i]));
maxHeap.Insert(a[i]);
}
Console.WriteLine(); Console.WriteLine("最大堆:" + maxHeap); Console.Write("删除元素90:");
maxHeap.Remove();
Console.WriteLine(maxHeap);
} private static void ShowMinHeap()
{
int[] a = { , , , , , , , , ,}; BinaryHeap<int> minHeap = new BinaryHeap<int>((int1, int2) => int1.CompareTo(int2) < );//最小推 Console.Write("测试数据:");
for (int i = ; i < a.Length; i++)
{
Console.Write(string.Format("{0} ", a[i]));
minHeap.Insert(a[i]);
}
Console.WriteLine(); Console.WriteLine("最小堆:" + minHeap); Console.Write("删除元素10:");
minHeap.Remove();
Console.WriteLine(minHeap);
}
} public class BinaryHeap<T> where T : IComparable
{
private List<T> mHeap;
private Func<T, T, bool> comparableFun;//这里我通过用表达式来决定大堆还是小堆 public BinaryHeap(Func<T, T, bool> _comparableFun)
{
mHeap = new List<T>();
comparableFun = _comparableFun;
} public void Insert(T t)
{
int count = mHeap.Count;
mHeap.Add(t); int middle = (count - ) / ;
T temp = mHeap[count]; while (count > && comparableFun(temp, mHeap[middle]))//temp.CompareTo(mHeap[middle]) < 0
{
mHeap[count] = mHeap[middle];
count = middle;
middle = (middle - ) / ;
}
mHeap[count] = temp;
} public T GetTopAndRemove()
{
var topT = mHeap[];
Remove(topT);
return topT;
} public void Remove(T t)
{
var index = mHeap.IndexOf(t); int count = mHeap.Count;
var temp = mHeap[count - ];
mHeap.RemoveAt(count - );
count = count - ; mHeap[index] = temp; int middle = index * + ;
while (middle < count && !comparableFun(temp,mHeap[middle]))//注意哦 这里多了个取反
{
mHeap[index] = mHeap[middle];
index = middle;
middle = middle * + ;
}
mHeap[index] = temp;
} public override String ToString()
{
StringBuilder sb = new StringBuilder();
for (int i = ; i < mHeap.Count; i++)
{
sb.Append(mHeap[i] + " ");
}
return sb.ToString();
}
}
}
二叉堆(C#)的更多相关文章
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- codevs 3110 二叉堆练习3
3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...
- 数据结构图文解析之:二叉堆详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- 二叉堆(二)之 C++的实现
概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...
- 二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- 在A*寻路中使用二叉堆
接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
关于如何使用EF Power Tool的介绍请看 http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html, 这里 ...
- 使用 Eclipse Memory Analyzer 进行简单内存泄漏分析
Java 内存泄露的根本原因: 保存了不可能再被访问的变量类型的引用.因此我们的目的就是要找出这样的引用. 1.测试代码: public class MainActivity extends Acti ...
- 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项
未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf116 ...
- HDU 5965 三维dp 或 递推
题意:= =中文题 思路一:比赛时队友想的...然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍. 定义dp[i][j][k],表示第i列, ...
- kvm and virtualbox running side by side
http://dedoimedo.com/computers/kvm-virtualbox.html
- Java 中的四种引用及垃圾回收策略
Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...
- Sql server 开窗函数over()的语法
用法一:与ROW_NUMBER()函数结合用,给结果进行排序编号,如图: 代码如下: SELECT ROW_NUMBER() over(order by RequiredDate) num ,* fr ...
- oracle中触发器的讲解
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...
- 每隔一秒自动执行函数(JavaScript)
http://www.cnblogs.com/xlx0210/archive/2010/03/19/1689497.html 1. setInterval() ——每隔一秒自动执行方法,setInte ...
- HttpServletResponse对象
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...