Java实现堆

堆是一种基于完全二叉树的数据结构,它分为大根堆和小根堆。在大根堆中,每个节点的值都大于或等于其子节点的值;而在小根堆中,每个节点的值都小于或等于其子节点的值。

在Java中,我们可以使用数组来表示堆。由于完全二叉树的性质,我们可以将堆的节点按照从上到下、从左到右的顺序对应到数组中。假设堆的根节点在数组中的下标为0,则其左孩子的下标为2i+1,右孩子的下标为2i+2,父节点的下标为(i-1)/2。

以下是使用Java实现堆的代码:

public class Heap {
    private int[] heap;   // 堆
    private int size;     // 堆的大小

    public Heap(int[] heap) {
        this.heap = heap;
        this.size = heap.length;
        buildHeap();
    }

    // 堆排序
    public void sort() {
        while (size > 1) {
            swap(0, size - 1);
            size--;
            heapify(0);
        }
    }

    // 构建堆
    private void buildHeap() {
        for (int i = (size - 2) / 2; i >= 0; i--) {
            heapify(i);
        }
    }

    // 堆化
    private void heapify(int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int max = i;
        if (left < size && heap[left] > heap[max]) {
            max = left;
        }
        if (right < size && heap[right] > heap[max]) {
            max = right;
        }
        if (max != i) {
            swap(i, max);
            heapify(max);
        }
    }

    // 交换元素
    private void swap(int i, int j) {
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }
}

上述代码实现了一个最大堆,堆的大小为数组的长度。堆排序的思路与普通的堆排序一致,先建立堆,然后每次将堆顶元素与堆底元素交换,缩小堆的大小,并重新堆化。

对于一个包含n个元素的数组,建立堆的时间复杂度为O(n),堆排序的时间复杂度为O(nlogn)。由于堆排序的空间复杂度为O(1),因此它是一种原地排序算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RS232串口_笔记

这里写目录标题 1、RS232串口理论起始位数据位校验位LSB & MSB示波器查看数据信号对应连接方式 1、RS232串口理论 UART(通用异步收发传输) 是一种通信协议&#xff0c;而 RS232 (串行通信接口)是种物理接口标准。UART 是一种用于在计算机和外部设备之间传输数据的协议&…

鸿蒙系统开发手册 - HarmonyOS内核驱动层源码分析

众所周知系统定义HarmonyOS是一款“面向未来”、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分布式操作系统。在传统的单设备系统能力的基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能…

链表高频面试题

1. 两个链表第一个公共子节点 LeetCode160 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; listA [4,1,8,4,5], listB [5…

11-22 SSM3

书城分页查询 使用mybatis分页插件&#xff1a; 请完成登陆注册 -> 跳转到首页 解决前端上架时间点击切换 以及侧边栏点击由背景颜色的改变 完成超链接的绑定点击时间 -> jquery $(document).ready(function() { // 初始化上架时间状态为 true&#xff08;上架&…

记录一次爱快路由ACL策略引起的大坑

环境&#xff1a; A公司和B公司采用爱快的ipsec互联 B公司同时有加密软件限制网络 问题&#xff1a;对方ERP无法连接我们的数据库服务器 先简单测试了下1433端口是不是通的 下面的测试结果&#xff0c;直接ping是通的&#xff0c;但是加上1433端口后就不通 排查过程&#xff1…

centos7下执行yum命令报错

前言 在Linux系统中&#xff0c;安装nginx时候&#xff0c;需要先安装环境。 Nginx是使用C语言开发&#xff0c;安装nginx需要先从官网上将源码下载&#xff0c;然后编译&#xff0c;编译需要gcc环境,但是在安装gcc环境的时候&#xff0c;执行命令报错。 yum install –y gcc-…

【开源】基于JAVA的大学计算机课程管理平台

项目编号&#xff1a; S 028 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S028&#xff0c;文末获取源码。} 项目编号&#xff1a;S028&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2…

有什么值得推荐的node. js练手项目吗?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数据库&…

使用JAVA语言写一个排队叫号的小程序

以下是一个简单的排队叫号的小程序&#xff0c;使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…

WPF绘制进度条(弧形,圆形,异形)

前言 WPF里面圆形进度条实现还比较麻烦,主要涉及到的就是动态绘制进度条的进度需要用到简单的数学算法。其实原理比较简单,我们需要的是话两条重叠的弧线,里面的弧线要比里面的弧线要宽,这样简单的雏形就出来了。 基础写法 我们可以用Path来绘制弧线,代码如下: <Gr…

推荐几款python在线学习和电子书网站

学习python的过程中&#xff0c;虽然下载了很多的电子书&#xff0c;但是在学习过程中基本上都是通过一些在线网站或者在线电子书进行的。 下面给大家推荐几个在线学习教程网站和电子书网站。 《菜鸟教程》 一句话介绍&#xff1a;很多初学者的选择 网址&#xff1a;https:…

C++11——右值引用和移动语义

左值和右值 在C11之前&#xff0c;我们很少去关注左值和右值这一概念&#xff0c;但是在C11中&#xff0c;加入了一个非常重要的语法&#xff1a;右值引用。 左值和右值&#xff0c;一般来说可以当作字面意思&#xff0c;左值是经常出现在表达式左边的值&#xff0c;右值是经…

【开源视频联动物联网平台】写一个物联网项目捐献给Dromara组织

一、平台简介 MzMedia开源视频联动物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、农业监测、水利监测、工业控制&#xff0c;车联网&#xff0c;监控直播&#xff0c;慢直播等场景。 支持抖音&#xff0c;视频号等主流短视频平台…

Linux--系统结构与操作系统

文章目录 冯诺依曼体系结构为什么要有内存&#xff1f;场景一 操作系统何为管理&#xff1f; 冯诺依曼体系结构 冯诺依曼体系结构是计算机体系结构的基本原理之一。它将程序和数据都以二进制形式存储&#xff0c;以相同的方式处理和存取。 上图是冯诺依曼体系结构的五大组成部…

处理机调度与作业调度

处理机调度 一个批处理型作业&#xff0c;从进入系统并驻留在外存的后备队列上开始&#xff0c;直至作业运行完毕&#xff0c;可能要经历如下的三级调度 高级调度 也称为作业调度、长程调度、接纳调度。调度对象是作业 主要功能&#xff1a; 挑选若干作业进入内存 为作业创建…

git push 报错 error: src refspec master does not match any 解决

git报错 ➜ *** git:(main) git push -u origin "master" error: src refspec master does not match any error: failed to push some refs to https://gitee.com/***/***.git最新版的仓库初始化后 git 主分支变成了 main 方法 1.把 git 默认分支名改回 master …

Sentinel的一些知识二

11231041 下一个是 熔断规则是异常数 和异常比例一样 只是换成了异常个数 1秒内的异常数有3个&#xff0c;就熔断2秒 下一步 进行压力测试 11231343 热点规则 没懂这个热点规则存在的意义 某个用户访问过于频繁&#xff0c;对其进行限制&#xff0c;给其他用户访问的机…

mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续

引言&#xff1a; 在使用MySQL数据库时&#xff0c;有时候我们需要删除某些记录&#xff0c;但是删除记录后可能会导致表中的id不再连续排序。 如何实现删除记录后让id重新排序的功能。 如图&#xff1a; 删除数据后&#xff0c;中间的id不会自动连续。 下面有两种方法进行重…

万界星空科技仓库管理wms系统

企业在管理库存时&#xff0c;尤其是生产制造企业&#xff0c;使用传统方式比如纸笔、Excel 管理库存&#xff0c;由于工具和信息化存在局限&#xff0c;导致在管理库存时出现如下问题&#xff1a; 1、通过纸笔记录出入库申请&#xff0c;人为手动计算易出错&#xff0c;数据易…

金石工程项目管理系统 SQL注入漏洞复现

0x01 产品简介 金石工程项目管理软件是一款工程项目管理软件,专门针对建筑工程项目开发,可以用于各种工地的项目管理。 0x02 漏洞概述 金石工程项目管理系统TianBaoJiLu.aspx接口处存在SQL注入漏洞&#xff0c;攻击者可通过该漏洞获取数据库中的信息&#xff08;例如&#xff…