数据结构之模拟堆 傷城~ 2023-01-01 11:57 108阅读 0赞 package com.qiangqiang.heap; public class Heap<T extends Comparable<T>> { public static void main(String[] args) { Heap<String> tHeap = new Heap<>(10); tHeap.insert("A"); tHeap.insert("B"); tHeap.insert("C"); tHeap.insert("D"); tHeap.insert("E"); tHeap.insert("F"); tHeap.insert("G"); String result = null; while ((result = tHeap.delMax()) != null) { System.out.println(result); } } //存储堆中的元素 private T[] items; //记录堆中的元素个数 private int N; //构造方法 public Heap(int capacity) { //堆其实就是一个数组 this.items = (T[]) new Comparable[capacity + 1]; this.N = 0; } //判断堆中索引i处的元素是小于索引j处的元素 public boolean less(int i, int j) { return items[i].compareTo(items[j]) < 0; } //交换堆中的索引i和索引j的值 public void exchange(int i, int j) { T temp = items[i]; items[i] = items[j]; items[j] = temp; } //往堆中插入一个元素 public void insert(T t) { items[++N] = t; //由于新增一个堆中的元素,都是在最后面新增的,所以要调整位置,应该往上层调整 swim(N); } //使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置 public void swim(int k) { //通过循环,不断的比较当前结点的值和父结点的值,如果发现父结点的值比当前结点的值小,则交换位置 while (k > 1) { if (less(k / 2, k)) { exchange(k / 2, k); } //一次循环后往上走一圈 k = k / 2; } } //使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置 public void sink(int k) { //通过循环,不断的比较当前k结点的值和其左子结点2k和右子结点2k+1的元素大小,如果当前结点小,则需要交换位置 while (2 * k <= N) { //获取当前结点的子结点中的较大结点 int max; if (2 * k + 1 <= N) { if (less(2 * k, 2 * k + 1)) { max = 2 * k + 1; } else { max = 2 * k; } } else { max = 2 * k; } //比较交换 if (!less(k, max)) { break; } else { exchange(k, max); } //变换k的值 k = max; } } //删除堆中的最大的元素,并返回这个最大元素 public T delMax() { T max = items[1]; //交换索引1处的元素和最大索引处的元素,让完全二叉树中最右侧的元素变为临时根节点 exchange(1, N); //最大索引处的元素删除掉 items[N] = null; //元素个数-1 N--; //让堆重新有序,同过下沉算法调整堆 sink(1); return max; } //使用下沉算法,是 }
相关 数据结构之堆 系列文章目录 [数据结构之PriorityQueue源码及特性分析 (大小根堆转换、扩容)\_crazy\_xieyi的博客-CSDN博客][PriorityQueue_ ゝ一纸荒年。/ 2024年04月03日 11:42/ 0 赞/ 62 阅读
相关 数据结构之堆 思考 假如需要设计一种数据结构,用来存放整数,要求提供3个接口: 添加元素 获取最大值 删除最大值 如果使用动态数组、双向链表和二叉树实现这个数据结 向右看齐/ 2023年02月21日 11:42/ 0 赞/ 82 阅读
相关 数据结构之模拟堆 package com.qiangqiang.heap; public class Heap<T extends Comparable<T>> { 傷城~/ 2023年01月01日 11:57/ 0 赞/ 109 阅读
相关 数据结构之模拟栈 package com.qiangqiang.stack; public class Stack<T> { //采用链表来实现 不念不忘少年蓝@/ 2023年01月01日 08:00/ 0 赞/ 124 阅读
相关 数据结构之模拟ArrayList package com.qiangqiang; import java.util.Arrays; / \ Created 你的名字/ 2022年12月31日 12:22/ 0 赞/ 108 阅读
相关 《大话数据结构》之堆排序 所谓的堆,实际是排序后的完全二叉树。 完成这个算法需要掌握排序后的完全二叉树的一些特性: 1、按层数,从上往下,依次为第一层,第二层,。。。,第n+1层。第n层的数据,一定 秒速五厘米/ 2022年08月20日 11:10/ 0 赞/ 213 阅读
相关 数据结构之堆排序 package com.zhiru; / 堆排序 时间复杂度:O(nlog2n) 空间复杂度:O(1) 以你之姓@/ 2022年08月11日 17:30/ 0 赞/ 175 阅读
相关 数据结构之堆 堆的定义 堆是一棵完全被填满的二叉树,可以的例外是在底层,底层上的元素从左到右填入。这样的树被称为完全二叉树。堆有两种情况,一种是大堆,就是最大元素在最根部的,一种是小堆 红太狼/ 2022年08月06日 15:21/ 0 赞/ 130 阅读
相关 数据结构之堆 (二叉)堆是一个数组,可以被看成一个近似的完全二叉树。 可以被用作对数组进行排序或者优先队列来使用。 以大顶堆为例,主要函数包含有以下几个: void Max-H 电玩女神/ 2022年06月04日 00:45/ 0 赞/ 175 阅读
相关 数据结构之堆 什么是堆 堆是一种特殊的树,需要满足两点要求: 1. 是完全二叉树 2. 每个节点都大于等于(或小于等于)其左右子节点 注:每个节点都大于等于其左右子节点的叫做大 ゞ 浴缸里的玫瑰/ 2022年04月13日 07:15/ 0 赞/ 177 阅读
还没有评论,来说两句吧...