C#练习二叉堆算法。

namespace 算法
{
/// <summary>
/// 最大堆
/// </summary>
/// <typeparam name="T"></typeparam>
public class IndexMaxHeap<T> where T:IComparable<T>
{
/// <summary>
/// 堆空间大小
/// </summary>
private int capacity;
/// <summary>
/// 数据项
/// </summary>
private T[] items;
/// <summary>
/// 堆实际大小
/// </summary>
private int count; /// <summary>
/// 构造方法,由用户指定开辟空间大小,注意元素从1开始
/// </summary>
/// <param name="n"></param>
public IndexMaxHeap(int n)
{
capacity = n+1;
items = new T[capacity];
count = 0;
}
/// <summary>
/// 堆实际大小
/// </summary>
/// <returns>返回堆实际大小int类型</returns>
public int size()
{
return count;
}
/// <summary>
/// 堆中是否有数据
/// </summary>
/// <returns></returns>
public bool isEmpty()
{
return count == 0;
} /// <summary>
/// 堆中插入一个元素
/// </summary>
/// <param name="item"></param>
public void insert(T item)
{
if (count+1 > capacity)
{
throw new IndexOutOfRangeException("堆空间溢出");
}
items[++count] = item;
shiftUp(count);
} /// <summary>
/// 出堆
/// </summary>
public T extractMax()
{
if (count <= 0)
{
throw new IndexOutOfRangeException("空数据");
}
T maxItem = items[1];
//先交换位置
swap(ref items[1], ref items[count]);
count--;
//做一次shiftdown操作
shiftDown(1); return maxItem; } private void shiftDown(int n)
{
while (n*2<=count)
{
int des = 2*n;
if (2 * n + 1<=count && items[n * 2].CompareTo(items[2 * n + 1]) < 0)
{
des = 2 * n + 1;
}
if (items[n].CompareTo(items[des]) < 0)
{
swap(ref items[n], ref items[des]);
n = des;
}
else
{
break;
} } } public void print()
{
for(int i = 1; i <= count; i++)
{
Console.WriteLine(items[i]);
}
} /// <summary>
/// 将堆底元素向上提
/// </summary>
/// <param name="n"></param>
private void shiftUp(int n)
{
//只要父级元素大于它,就一直循环并交换
while (n>1 && items[n].CompareTo(items[n/2])>0)
{
int j = n / 2;
swap(ref items[n], ref items[j]);
n = j;
} } private void swap(ref T a,ref T b)
{
T c = a;
a = b;
b = c; } } public class Test
{
public static void Main()
{
IndexMaxHeap<int> heap = new IndexMaxHeap<int>(15); for (int i = 0; i < 10; i++)
{
Random rd = new Random();
int a = rd.Next(10, 100);
heap.insert(a);
// Console.WriteLine(a);
}
Console.WriteLine("---");
Console.WriteLine($"最大值:{heap.extractMax()}");
heap.print();
Console.WriteLine("+++++++++++++++");
HeapSort<int>(new int[5] { 3, 2, 4, 6, 7 });
Console.ReadKey();
} /// <summary>
/// 堆排序
/// </summary>
public static T[] HeapSort<T>(T[] arr ) where T:IComparable<T>
{
IndexMaxHeap<T> a = new IndexMaxHeap<T>(100);
for(int i = 0; i < arr.Length; i++)
{
a.insert(arr[i]);
}
//从小到大
for(int i = arr.Length-1; i >=0; i--)
{
T t = a.extractMax();
arr[i] = t;
}
return arr; } } public class a : IComparable<a>
{
public int CompareTo(a other)
{
throw new NotImplementedException();
}
}
}

C# 最大二叉堆算法的更多相关文章

  1. PHP利用二叉堆实现TopK-算法的方法详解

    前言 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证 内存和速度的效率,我们可能第一个想法就是利用排序,然后 ...

  2. PHP-利用二叉堆实现TopK-算法

    介绍 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截 ...

  3. 《Algorithms算法》笔记:优先队列(2)——二叉堆

    二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...

  4. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  5. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

    [0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...

  6. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  7. 数据结构与算法——优先队列类的C++实现(二叉堆)

    优先队列简单介绍: 操作系统表明上看着是支持多个应用程序同一时候执行.其实是每一个时刻仅仅能有一个进程执行,操作系统会调度不同的进程去执行. 每一个进程都仅仅能执行一个固定的时间,当超过了该时间.操作 ...

  8. 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆

    二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...

  9. 【算法与数据结构】二叉堆和优先队列 Priority Queue

    优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...

随机推荐

  1. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  2. flask_mysql入库

    mysql 的入库和MongoDB的有一点点的区别 不过都很重要,都必须要掌握的技能, 现在我来演示一下mysql入库的过程: 首先  我们要导包,这是必不可少的一部分,都不用我说了吧 #导报 imp ...

  3. JS: 数组的循环函数

    JS 数组相关的循环函数,用得挺多,所以有些坑还是要去踩一下,先来看一道面试题. 注意:下面提到的不改变原数组仅针对基本数据类型. 面试题 模拟实现数组的 map 函数. 心中有答案了吗?我的答案放在 ...

  4. 【xsy2193】Wallace 最大权闭合子图

    题目大意:给你一棵$n$个节点的树$a$,每个点有一个点权$val_i$,同时给你另一棵$n$个节点的树$b$. 现在你需要在树$a$上找一个联通块,满足这些点在树$b$上也是连通的,同时树$a$的这 ...

  5. POJ 2505

    #include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("a ...

  6. oracle RAC 跨网段客户端访问 报ORA-12170

    场景描述: 服务器所在网段为20,在同一网段的机器客户端远程连接SCAN IP 可以正常访问,当时更换了网段之后,15网段的机器通过oracle客户端连接服务器SCAN ip 无法正常访问,telne ...

  7. Intellij IDEA 环境配置与使用

    Intellij IDEA 是我感觉最牛X的IDE开发工具,没有之一! 先share一篇教程: http://pan.baidu.com/s/1i3fzJff 调整字体 设置默认的JDK 显示行号 版 ...

  8. 获取Javascript 滚动条距离顶部的距离(兼容IE6+,火狐,谷歌,其它没测)

    document.body.scrollTop || document.documentElement.scrollTop

  9. js便签笔记(5)——Dean Edwards大牛的跨浏览器AddEvent()设计(不知道是不是jQuery事件系统的原型)

    1. 前言: 在看Aaron的jquery源码解读时候,看到事件系统那块,作者提到了Dean Edwards的添加事件的设计,于是就点进去看了看.首先让我吃惊的是,代码非常少,寥寥几十行,非常简单.于 ...

  10. Linux下自动清理超过指定大小文件的方法

    由于线上业务用的squid,根据经验值如果长时间运行则缓存目录下的swap.state会慢慢变大,一旦超过60M,squid的性能就会急剧下降,因此需要定时去清理大于60M的swap.state文件. ...