iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java语言如何实现最大堆
  • 143
分享到

Java语言如何实现最大堆

java 2023-05-30 19:05:49 143人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Java语言如何实现最大堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用

这篇文章将为大家详细讲解有关Java语言如何实现最大堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

最大堆

最大堆的特点是父元素比子元素大,并且是一棵完全二叉树

data[1]开始存,data[0]空着不用。也可以把data[0]当成size来用。

public class MaxHeap<T extends Comparable<? super T>> {private T[] data;private int size;private int capacity;public MaxHeap(int capacity) {this.data = (T[]) new Comparable[capacity + 1];size = 0;this.capacity = capacity;}public int size() {return this.size;}public Boolean isEmpty() {return size == 0;}public int getCapacity() {return this.capacity;}public T seekMax() {return data[1];}public void swap(int i, int j) {if (i != j) {T temp = data[i];data[i] = data[j];data[j] = temp;}}public void insert(T item) {size++;data[size] = item;shiftUp(size);}public T popMax() {swap(1, size--);shiftDown(1);return data[size + 1];}public void shiftUp(int child) {while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {swap(child, child / 2);child = child / 2;}}private int max(int a, int b) {if (data[a].compareTo(data[b]) < 0) {//如果data[b]大return b;//返回b} else {//如果data[a]大return a;//返回a}}private int max(int a, int b, int c) {int biggest = max(a, b);biggest = max(biggest, c);return biggest;}public void shiftDown(int father) {while (true) {int lchild = father * 2;//左孩子int rchild = father * 2 + 1;//右孩子int newFather = father;//newFather即将更新,父、左、右三个结点谁大,newFather就是谁的下角标if (lchild > size) {//如果该father结点既没有左孩子,也没有右孩子return;} else if (rchild > size) {//如果该father结点只有左孩子,没有右孩子newFather = max(father, lchild);} else {//如果该father结点既有左孩子,又有右孩子newFather = max(father, lchild, rchild);}if (newFather == father) {//说明father比两个子结点都要大,表名已经是大根堆,不用继续调整了return;} else {//否则,还需要继续调整堆,直到满足大根堆条件为止swap(father, newFather);//值进行交换father = newFather;//更新father的值,相当于继续调整shiftDown(newFather)}}}public static void main(String[] args) {//创建大根堆MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);//向堆里存for (int i = 0; i < 100; i++) {maxHeap.insert((int) (Math.random() * 100));}//创建数组Integer[] arr = new Integer[100];//从堆里取,放进数组里for (int i = 0; i < 100; i++) {arr[i] = maxHeap.popMax();System.out.print(arr[i] + " ");}System.out.println();}}

最大堆:shiftDown()函数与上面不一样

public class MaxHeap<T extends Comparable<? super T>> {private T[] data;private int size;private int capacity;public MaxHeap(int capacity) {data = (T[]) new Comparable[capacity + 1];this.capacity = capacity;size = 0;}public int size() {return size;}public Boolean isEmpty() {return size == 0;}public void insert(T item) {data[size + 1] = item;size++;shiftUp(size);}public T popMax() {T ret = data[1];swap(1, size);size--;shiftDown(1);return ret;}public T seekMax() {return data[1];}public void swap(int i, int j) {if (i != j) {T temp = data[i];data[i] = data[j];data[j] = temp;}}public void shiftUp(int k) {while (k > 1 && data[k / 2].compareTo(data[k]) < 0) {swap(k, k / 2);k /= 2;}}public void shiftDown(int father) {while (2 * father <= size) {int newFather = 2 * father;if (newFather + 1 <= size && data[newFather + 1].compareTo(data[newFather]) > 0) {//data[j] data[j+1]两者取大的那个newFather = newFather + 1;}if (data[father].compareTo(data[newFather]) >= 0) {break;} else {swap(father, newFather);//值进行交换father = newFather;//newFather是(2*father)或者是(2*father+1),也就是继续shiftDown(newFather);}}}public static void main(String[] args) {//创建大根堆MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);//向堆里存for (int i = 0; i < 100; i++) {maxHeap.insert((int) (Math.random() * 100));}//创建数组Integer[] arr = new Integer[100];//从堆里取,放进数组里for (int i = 0; i < 100; i++) {arr[i] = maxHeap.popMax();System.out.print(arr[i] + " ");}System.out.println();}}

关于“Java语言如何实现最大堆”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java语言如何实现最大堆

本文链接: https://www.lsjlt.com/news/220550.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java语言如何实现最大堆
    这篇文章将为大家详细讲解有关Java语言如何实现最大堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用...
    99+
    2023-05-30
    java
  • Python实现最大堆(大顶堆)
    最大堆是指最大的元素在堆顶的堆。Python自带的heapq模块实现的是最小堆,没有提供最大堆的实现。虽然有些文章通过把元素取反再放入堆,出堆时再取反,把问题转换为最小堆问题也能间接实现最大堆,但是这样的实现只适合数值型的元素,不适合自定...
    99+
    2023-01-31
    大堆 Python 大顶堆
  • Java中PriorityQueue实现最小堆和最大堆的用法
    目录一、基本介绍 1、介绍2、用法3、最小堆4、最大堆5、其他优先级二、常用方法三、相关练习题一、基本介绍  1、介绍 学习很多算法知识,力争做到最优解的学习过程...
    99+
    2024-04-02
  • Java语言如何实现二叉堆的打印
    这篇文章将为大家详细讲解有关Java语言如何实现二叉堆的打印,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最...
    99+
    2023-05-30
    java
  • Java如何实现二叉堆、大顶堆和小顶堆
    这篇文章将为大家详细讲解有关Java如何实现二叉堆、大顶堆和小顶堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是二叉堆二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。在二叉树建树时采取前序建...
    99+
    2023-06-29
  • 详解Java如何实现小顶堆和大顶堆
    大顶堆 每个结点的值都大于或等于其左右孩子结点的值 小顶堆 每个结点的值都小于或等于其左右孩子结点的值 对比图 实现代码 public class HeapNode{ ...
    99+
    2024-04-02
  • 【算法——Python实现】最大堆和最小
    # _*_ encoding:utf-8 _*_ """ 最大堆 """ class MaxHeap(object): # def __init__(self): # self.data = [] # 创...
    99+
    2023-01-31
    算法 大堆 最小
  • Java实现二叉堆、大顶堆和小顶堆
    目录什么是二叉堆什么是大顶堆、小顶堆建堆程序实现建立大顶堆逻辑过程程序实现建立小顶堆逻辑过程程序实现从堆顶取数据并重构大小顶堆什么是二叉堆 二叉堆就是完全二叉树,或者是靠近完全二叉树...
    99+
    2024-04-02
  • Java数据结构之最小堆和最大堆的原理及实现详解
    目录一、前言二、堆的数据结构三、堆的代码实现1. 实现介绍2. 入堆实现3. 出堆实现4. 小堆实现5. 大堆实现一、前言 堆的历史 堆的数据结构有很多种体现形式,包括;2-3堆、B...
    99+
    2024-04-02
  • C语言实现大顶堆的示例代码
    目录堆的实现1.堆结构2.堆的种类3.大顶堆代码实现堆的实现 1.堆结构 逻辑结构上类似于 一棵 “树” 2.堆的种类 大顶堆结构: 一种特殊的树:其每个...
    99+
    2024-04-02
  • C语言详解如何实现堆及堆的结构与接口
    目录一、堆的结构及实现(重要)1.1 二叉树的顺序结构1.2 堆的概念及结构1.3 堆的实现1.3.1 堆的向下调整算法1.3.2 向下调整算法的时间复杂度1.3.3 堆的创建(向下...
    99+
    2024-04-02
  • R语言如何实现选取某一行的最大值
    小编给大家分享一下R语言如何实现选取某一行的最大值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!可以先自定义函数也可以用的时候再定义。> mat&...
    99+
    2023-06-14
  • go语言堆排序怎么实现
    Go语言堆排序的实现步骤如下: 首先,定义一个用于进行堆调整的函数 adjustHeap,该函数接受三个参数:待调整的切片 arr...
    99+
    2023-10-22
    go语言
  • Java语言如何实现队列
    这篇文章主要介绍了Java语言如何实现队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。队列队列是一种特殊的线性表,只允许在表的前端进行删除操作,在表的后端进行插入操作。队列...
    99+
    2023-06-29
  • C语言堆怎么实现和堆排序是什么
    这篇文章主要介绍了C语言堆怎么实现和堆排序是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言堆怎么实现和堆排序是什么文章都会有所收获,下面我们一起来看看吧。一、本章重点堆的介绍堆的接口实现堆排序二、堆2...
    99+
    2023-06-29
  • C语言如何实现飞机大战
    本文小编为大家详细介绍“C语言如何实现飞机大战”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现飞机大战”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体代码如下#include<stdio.h...
    99+
    2023-07-02
  • java堆栈大小如何设置
    在Java虚拟机中,堆和栈是两种不同的内存区域。 堆用于存储对象实例和数组,而栈用于存储方法调用和局部变量。 要设置Java堆的大小...
    99+
    2023-10-28
    java
  • C语言如何求最大公约数
    本篇内容介绍了“C语言如何求最大公约数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. C语言简介1.1 C语言发展史C语言是一种广泛使用...
    99+
    2023-06-29
  • C语言怎么实现堆及堆的结构与接口
    本文小编为大家详细介绍“C语言怎么实现堆及堆的结构与接口”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现堆及堆的结构与接口”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、堆的结构及实现(重要)1....
    99+
    2023-06-30
  • Go语言如何实现大数据处理?
    随着大数据时代的到来,数据量的爆炸式增长已经成为了一个不可避免的趋势。在这种情况下,如何高效地处理大数据成为了一个急需解决的问题。Go语言作为一种编译型、静态类型的语言,具有高效、高并发等特点,因此也成为了处理大数据的一种优秀的选择。 G...
    99+
    2023-11-13
    大数据 numy spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作