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/
posted @   TTonlyV5  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
点击右上角即可分享
微信分享提示