使用系统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/