C# 最大二叉堆算法
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# 最大二叉堆算法的更多相关文章
- PHP利用二叉堆实现TopK-算法的方法详解
前言 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证 内存和速度的效率,我们可能第一个想法就是利用排序,然后 ...
- PHP-利用二叉堆实现TopK-算法
介绍 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截 ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
[0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- 数据结构与算法——优先队列类的C++实现(二叉堆)
优先队列简单介绍: 操作系统表明上看着是支持多个应用程序同一时候执行.其实是每一个时刻仅仅能有一个进程执行,操作系统会调度不同的进程去执行. 每一个进程都仅仅能执行一个固定的时间,当超过了该时间.操作 ...
- 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆
二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...
- 【算法与数据结构】二叉堆和优先队列 Priority Queue
优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...
随机推荐
- mac下查看jdk安装版本及安装目录
使用IntelliJ idea新建工程时需要查看jdk安装目录,记录下来为以后备用. mac自带jdk,查看jdk版本: IcarusdeMacBook-Pro:~ icarus$ java -ver ...
- Linux系统软件包的管理(4)
虽然使用源码编译安装可以具有提高速度个性化的定制等优点,但对于 Linux发行商来说,则不容易管理软件包,毕竟不是每个人都会进行源码编译的,如果能够将软件预先在相同的硬体与系统上面编译好在发布的话,不 ...
- CE+X64dbg外挂制作教程 [提高篇]
人造指针&基址 实验目标:通过向游戏注入一段特殊汇编代码,实现自动获取动态地址.省略找基址的麻烦 为什么会出现人造指针 ? 1.基址偏移层数太多,很难找 2.有些游戏根本找不到基址 人造指针有 ...
- WebRTC开发基础(WebRTC入门系列2:RTCPeerConnection)
RTCPeerConnection的作用是在浏览器之间建立数据的“点对点”(peer to peer)通信. 使用WebRTC的编解码器和协议做了大量的工作,方便了开发者,使实时通信成为可能,甚至在不 ...
- Flask常用的钩子函数
before_first_request:处理第一次请求之前执行.例如以下代码: @app.before_first_request def first_request(): print 'first ...
- copy代码的时候,如何去掉代码前边的编号
从网页上拷贝下来的代码前面总有编号,如何去掉! 1.使用正则表达式:在editorplus(notepad++)里按ctrl+h,弹出框里勾选上“正则表达式(regular expression)”, ...
- C#:ListView控件如何实现点击列表头进行排序?
using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...
- [个人项目] 使用 Vuejs 完成的音乐播放器
Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获. api:我使用的是一个开源的 nod ...
- Android面试题(1)
1. Java语言基本数据类型有哪些?分别占用的内存空间是多少? 答: byte(1字节),boolean(1字节),char(2字节),short(2字节),int(4字节),float(4字节) ...
- wordpress添加面包屑
第一步:在functions.php中添加如下代码 // 面包屑导航 function get_breadcrumbs() { global $wp_query; if ( !is_home() ){ ...