C#自定义堆
使用系统API SortedSet(Red-Black Tree)也可以实现
自定义堆主要在于通过比较器实现大/小值的比较
插入siftup上浮
删除siftdown,删除为了避免数据的移动产生Array.Copy,交换堆首与堆尾,并删除堆尾,然后siftdown
private Heap<int> maxHeap = new Heap<int>();
private Heap<int> minHeap = new Heap<int>(Comparer<int>.Create((x, y) => y.CompareTo(x)));
public class Heap<T>
{
private List<T> data = new List<T>();
private readonly IComparer<T> comparer;
public Heap(IComparer<T> comparer = null)
{
this.comparer = comparer ?? Comparer<T>.Default;
}
public void Push(T value)
{
data.Add(value);
SiftUp(data.Count - 1);
}
public void Pop()
{
Swap(0, data.Count - 1);
data.RemoveAt(data.Count - 1);
SiftDown(0);
}
public T Peek()
{
return data[0];
}
public int Count => data.Count;
private void SiftUp(int k)
{
while (k != 0)
{
int father = (k - 1) / 2;
if (comparer.Compare(data[k], data[father]) <= 0) break;
Swap(k, father);
k = father;
}
}
private void SiftDown(int k)
{
while (k * 2 + 1 < data.Count)
{
int son = k * 2 + 1;
if (k * 2 + 2 < data.Count && comparer.Compare(data[son], data[k * 2 + 2]) <= 0)
{
son = k * 2 + 2;
}
if (comparer.Compare(data[son], data[k]) <= 0) break;
Swap(k, son);
k = son;
}
}
private void Swap(int i, int j)
{
if (i != j)
{
var t = data[i];
data[i] = data[j];
data[j] = t;
}
}
}
```
https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solution/zi-ding-yi-da-xiao-dui-by-mitty/
总有一些人过着你想要的生活
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!