zoukankan      html  css  js  c++  java
  • 大顶堆的实现

    // 创建堆
    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);
  • 相关阅读:
    :Linux 系统日志管理 日志转储
    Linux 系统日志管理 rsyslogd配置文件
    Linux 系统日志管理
    Linux 定时任务
    Linux进程管理 lsof命令:列出进程调用或打开的文件信息
    Linux查看系统与内核信息(uname、file和lsb_release -a)
    Linux查看本机登陆用户信息(w、who、last和lastlog命令)
    windows下安装mingw
    debian7.8 安装 chm
    Linux-vmware tools安装与cdrom挂载
  • 原文地址:https://www.cnblogs.com/strivegys/p/13214433.html
Copyright © 2011-2022 走看看