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 @ 2022-02-12 21:57  TTonlyV5  阅读(71)  评论(0编辑  收藏  举报