美文网首页
大顶堆生成、新增、删除、排序javascript实现

大顶堆生成、新增、删除、排序javascript实现

作者: hait_632c | 来源:发表于2019-07-13 17:29 被阅读0次

大顶堆小顶堆的概念和使用本文不赘述,使用js实现一个大顶堆的创建,新增,删除以及利用大顶堆排序

class Heap{
        constructor(data){
            // 存储data数据
            this.data = [...data];
            // 新增和删除不重新生成堆,根据二叉树快速的遍历新节点所在的树路径,需要源数据是已经初始化好的大顶堆结构
            this.isTopLargeHeap = false;
        }
        _swap(a, b){
            // 交换数据
            let tmp = this.data[a];
            this.data[a] = this.data[b];
            this.data[b] = tmp;
        }
        _heapDown(i, n){
            // i为当前父节点的下标,n为参与最大子节点的限制
            // 小顶堆只需修改下下方数值判断表达式 // 
            let data = this.data;
            // 父节点的值>左子节点的值
            if (2*i+1 < n && data[i] < data[2*i+1]) {
                this._swap(i,2*i+1);
                // 左子树遍历生成序列化
                this._heapDown(2*i+1, n);
            }
            // 父节点的值>右子节点的值
            if (2*i+2 < n && data[i] < data[2*i+2]) {
                this._swap(i,2*i+2);
                // 右子树遍历生成序列化
                this._heapDown(2*i+2, n);
            }
        }
        _heap(n){
            // n为限制当前最大参与序列化的值,主要为堆排序使用
            for (let i = Math.floor(n/2)-1; i >= 0; i--) {
                this._heapDown(i, n);
            }
        }
        createHeap(){
            // 创建当前数据的大顶堆
            this._heap(this.data.length);
            this.isTopLargeHeap = true;
            return this.data;
        }
        sort(){
            // 利用大顶堆升序排序,如是小顶堆可用来降序排序
            let i = this.data.length;
            while(i){
                this._heap(i);
                this._swap(0,i-1);
                i--;
            }
            this.isTopLargeHeap = false;
            return this.data;
        }
        getData(){
            return this.data;
        }
        insert(item){
            // 插入数据并保持大顶堆结构
            if (!this.isTopLargeHeap) throw 'please do createHeap first';
            this.data.push(item);
            let len = this.data.length,
                index = Math.floor(len/2)-1;
            while(index >= 0){
                console.log(index);
                this._heapDown(index, len);
                // 向上找父节点
                index = Math.floor((index+1)/2-1);
            }
        }
        delete(){
            if (!this.isTopLargeHeap) throw 'please do createHeap first';
            this.data[0] = this.data[this.data.length -1];
            this.data.splice(this.data.length -1,1);
            // 删除最顶部节点,此时把最后一个子节点放到根节点,只需处理根节点“下沉”
            this._heapDown(0, this.data.length);
        }
    }

相关文章

  • 大顶堆生成、新增、删除、排序javascript实现

    大顶堆小顶堆的概念和使用本文不赘述,使用js实现一个大顶堆的创建,新增,删除以及利用大顶堆排序

  • 堆排序的实现

    使用大顶锥实现升序排序,二叉堆的详细操作见以前的文章 步骤如下: 先构建大顶堆 然后循环删除堆顶元素(交互首尾元素...

  • 堆排序的实现

    用大顶堆实现堆排序

  • 堆-Heap

    堆-Heap 堆的基本接口设计 二叉堆(最大堆) 大顶堆-添加 大顶堆-删除 删除堆顶元素的同时插入一个新元素 大...

  • 简单数据结构(二) 堆

    堆排序思路 将传入的数组看作是一个没有完成的堆 将堆整理排序成一个大顶堆 将大顶堆最大的元素,也就是堆顶,与这个堆...

  • 温习 6+2 种排序方式

    堆排序(实现难易:⭐⭐⭐) ① 将序列生成堆,调整成最大堆② 弹出堆顶,生成新序列,重复 ① 。 快速排序(实现难...

  • 堆和堆排序

    什么是堆? 如何存储一个堆(如何实现一个堆?) 堆的插入、删除操作 如何基于堆实现排序?(建堆和排序) 为什么快速...

  • C 语言实现堆排序 (Heap Sort)

    堆排序是一种基于「堆」这一数据结构的排序算法。堆是一种近似完全二叉树的结构,分为大顶堆和小顶堆这两种。 大顶堆:子...

  • 堆排序(大顶堆)

    主要是围绕heapify操作 建堆,从下往上对每一个父节点heapify。第一个父节点的下标是 ((n -1)-1...

  • 堆排序

    堆排序是排序算法中的一种,时间复杂度是O(n log(n))。 堆是由完全二叉树实现的 大顶堆:父节点都比子节点要...

网友评论

      本文标题:大顶堆生成、新增、删除、排序javascript实现

      本文链接:https://www.haomeiwen.com/subject/kyymkctx.html