• 大顶堆的实现


    // 创建堆
    function CreateHeap(MaxSize,MaxData) {
        this.MaxSize = MaxSize;
        this.Heap = new Array();
        this.Heap[0] = MaxData   // 定义" 哨兵 " 为大于堆中所有可能元素的值
        this.isFull = CreateHeap.isFull
        this.Insert = CreateHeap.Insert
        this.isEmpty = CreateHeap.isEmpty
        this.DeleteMax = CreateHeap.DeleteMax
    }
    
    CreateHeap.isFull = function() {
        return this.Heap.length == this.MaxSize;
    }
    CreateHeap.Insert = function(element) {
        let i;
        if(this.isFull()) {
            console.error("最大堆已满")
            return -1;
        }
    
        this.Heap.push(element);  //长度+1
        i = this.Heap.length - 1;
    
        for(;this.Heap[Math.floor(i/2)] < element;i=Math.floor(i/2)) {  // 进行向下取整
            this.Heap[i] = this.Heap[Math.floor(i/2)]
        }
    
        this.Heap[i] = element;
        return this;
    }
    CreateHeap.isEmpty = function() {
        return (this.Heap.length - 1 == 0)
    }
    CreateHeap.DeleteMax = function() {
        // parent 代表 父节点,child 代表 子节点,maxItem 代表 删除的最大值,element 代表 堆中最后一个值
        let parent, child, maxItem, element; 
        if(this.isEmpty()) {
            console.error("最大堆已空");
            return -2;
        }
    
        maxItem = this.Heap[1];
        element = this.Heap[this.Heap.length - 1];
        this.Heap.length--;
    
        for(parent = 1; parent*2<=this.Heap.length-1; parent=child) {  // 判断是否有左子树,如果没有直接跳过,进行赋值
            child = parent * 2;
            if((child != this.Heap.length-1) && (this.Heap[child] < this.Heap[child +1])) {        // 找出两个节点的最大值
                child++
            }
            if(element > this.Heap[child]) {
                break;
            } else {
                this.Heap[parent] = this.Heap[child];   // 将子节点中的最大值,放到parent位置
            }
        }
        this.Heap[parent] = element;
    
        return maxItem;
    }
    
    
    let heap = new CreateHeap(8,1000);
    heap.Insert(10).Insert(14).Insert(16).Insert(15).Insert(8).Insert(11)
    console.log(heap.Heap);
    console.log(heap.DeleteMax());
    console.log(heap.Heap);
  • 相关阅读:
    寒假日报day10
    寒假日报day9
    周计划06(20201026-20201101)
    周计划05(20201019-20201025)
    周总结2
    编程语言的实现模式读后感1
    软工总结
    哈夫曼编码算法
    hive表查询——排序
    假期总结4
  • 原文地址:https://www.cnblogs.com/strivegys/p/13214433.html
Copyright © 2020-2023  润新知