最大堆

class MaxHeap {
        constructor(arr = []) {
            this.container = [];
            if (Array.isArray(arr)) {
                arr.forEach(this.insert.bind(this));
            }
        }
        
        compare(a, b) {
            return a - b; // MaxHeap
        }

        insert(data) {
            const { container } = this;
            container.push(data);
            // 自底向上交换
            let index = container.length - 1;
            while (index) {
                let parent = Math.floor((index - 1) / 2);
                if (compare(container[parent], container[index]) >= 0) {
                    break;
                }
                [container[parent], container[index]] = [container[index], container[parent]];
                index = parent;
            }
        }

        extract() {
            const { container } = this;
            [container[0], container[container.length - 1]] = [container[container.length - 1], container[0]];
            const val = container.pop();
            let index = 0;
            let child = 1;
            // 自顶向下交换
            while (child < container.length) {
                if (child + 1 < container.length && compare(container[child + 1], container[child]) > 0) {
                    child = child + 1;
                }

                if (compare(container[index], container[child]) >= 0) {
                    break;
                }

                [container[index], container[child]] = [container[child], container[index]];
                index = child;
                child = child * 2 + 1; 
            }
            return val;
        }

        top() {
            const { container } = this;
            if (container.length) {
                return container[0];
            }
            return null;

        }
    }

最后更新于