首页 > 编程语言 >java数据结构与算法基础-----排序------堆排序

java数据结构与算法基础-----排序------堆排序

时间:2024-03-23 11:30:47浏览次数:16  
标签:结点 java min int 堆排序 ----- 小根堆 root left

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

  1. 堆排序是利用堆(数据结构)设计的排序算法,属于选择排序,最坏,最好,平均时间复杂度均为O(n logn),不稳定排序
  2. 堆是具有以下性质的完全二叉树:
  1. 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆
  2. 不对结点的左孩子的值和右孩子的值的大小关系进行要求。
  3. 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
    在这里插入图片描述
    在这里插入图片描述
堆排序基本思想(以使用小顶堆为例)
  1. 堆排序,就是符合一定规则的完全二叉树,这个规则是:整个二叉树中,你随便挑出一颗子树,都满足根结点>=左右孩子(大根堆)或者根结点<=左右孩子(小根堆)
  2. 所以如果我们采用从下往上构建堆,是比较方便的。只需要关注当前的子树满足指定规则即可
  3. 例如我们想要构建一个长度为4的小顶堆,需要插入的元素是[3,2,3,1,2,4,5,5,6],我们想要实现,保留[3,2,3,1,2,4,5,5,6]中最大的4个在小顶堆中
  1. 先无脑插入4个结点,因为我们的堆长度为4,heap=[3,2,3,1]
  2. 然后调整堆,从第一个非叶子结点开始调整,利用完全二叉树公式len/2-1是第一个非叶子,len/2-2是第二个非叶子,依次类推
  1. 第一个非叶子结点root为4/2 - 1 = 1,也就是heap[1] = 2. 然后根据完全二叉树公式获取其左右孩子,left = root * 2+1 和 right = root * 2+2。也就是left = 1 * 2+1 = heap[3] = 1.right = 1 * 2+2 = 4,超出堆大小,没有右孩子。
  2. 此时我将让root和left以及right比较,谁小谁做根结点。发现root = heap[1] = 2 > left = heap[3] = 1.故root下降到left位置,left上升到root位置。
  3. 从而堆变成heap = [3,1,3,2]
  4. 第二个非叶子结点root为4/2-2 = 0,也就是heap[0] = 3, 其left = 0 * 2 +1 = heap[1] = 1.其right = 0 * 2+2 = heap[2] = 3.
  5. 比较后发现,root>left,因此进行root下降到left操作,也就是交换位置swap(root,left),此时heap = [1,3,3,2]
  6. 然后发现此时root指向原来left位置,也就是下降一次后,root = heap[1] = 3,我们发现它还有一个左孩子left = 1 * 2+1 = heap[3] = 2. 我们发现root>left,因此root继续下降,此时heap = [1,2,3,3]
  1. 堆构建完成后,我们进行插入操作,现在该插入第5个结点,[2],我们发现[2]>堆顶的[1].因此[1]肯定不是序列中最大的4个中的一个,所以我们将堆顶元素heap[0] 换为 [2].然后重新回到上面的调整堆的操作。也就是不断下降的操作,直到[2]下降到符合小根堆的位置。
  2. 依次类推,直到所有元素处理完成,就构建完成了一个小顶堆
代码
  1. 用到的公式(二叉树的基本公式)
  1. arr[i]<=arr[2 * i+1] && arr[i] <= arr[2 * i+2] 小顶堆条件,当前非叶子节点arr[i],左节点和右节点,都小于它,大顶堆正好相反,左右都大于它本身
  2. 第一个非叶子节点arr.length/2-1
  3. 当前节点的左子节点,i * 2+1,当前节点右子节点i * 2+2

直接实现小根堆难免让人不知道这是干什么用的,因此,用一道算法题来理解。这道题的代码完全就是小根堆的代码。

标签:结点,java,min,int,堆排序,-----,小根堆,root,left
From: https://blog.csdn.net/grd_java/article/details/136937525

相关文章

  • 网络工程师的Python之路-网络运维自动化实战-1.2
    1.2.2脚本模式在Windows里,有两种方法创建Python脚本,一种是将代码写进Windows记事本里,另一种是借助第三方编辑器。两种方法分别介绍如下。1.使用记事本创建Python脚本在桌面上新建一个记事本文件,将代码print('hello,world!')写入,如下图所示。然后将其另存为.p......
  • 模型数据-如何放入request域中
    自动放入request域中springmvc会自动把获取的model模型,放入到request域中验证代码后端获取了master对象,这时就自动的把对象传到request域中了,为了验证这个猜想,我们需要从前端的jsp中看是否可以在request中取到master。//验证自动放入request域@RequestMapping("......
  • Rest-优雅的请求风格(图书增删改查的案例)
    前的浏览器只支持post/get请求,因此为了得到put/delete的请求方式需要使用Spring提供的HiddenHttpMethodFilter过滤器进行转换(只能转换post).前端代码<%--CreatedbyIntelliJIDEA.User:YRXDate:2024/3/13Time:13:29TochangethistemplateuseFile......
  • (Java)猛刷LeetCode——数组知识点篇
    数组Array在连续的内存空间中,存储一组相同类型的元素元素:值索引:数组的下标数组访问(Access)和数组搜索(Search)●数组访问:索引●数组搜索:找2这个元素数组中有没有以下是数组的常规操作:数组创建、添加元素、访问元素、修改元素、删除元素、遍历数组、查找元素、数组......
  • 论文研读(含2G的CSI数据集+导入数据的代码):CSI-Former: Pay More Attention to Pose Est
    论文概述本文提出了一种新的基于WiFi的姿态估计方法。基于WiFi的信道状态信息(CSI),提出了一种新的结构CSI-former。为了评估CSI-former的性能,本文建立了一个新的数据集Wi-Pose。该数据集由5GHzWiFiCSI、相应的图像的骨架点注释组成。背景Transformer由于其强大的多头注意力......
  • 解决 scroll-view 组件 [Intervention] 报错
    [Intervention]Ignoredattempttocancelatouchmoveeventwithcancelable=false,forexamplebecausescrollingisinprogressandcannotbeinterrupted解决报错如下图,因为事件冒泡,scroll-view组件的touchmove事件可以传递到模态框。于是我给scroll-view取......
  • 《自动机理论、语言和计算导论》阅读笔记:p1-p4
    《自动机理论、语言和计算导论》学习第1天,p1-p4,总计4页。这只是个人的学习记录,因为很多东西不懂,难免存在理解错误的地方。一、技术总结1.有限自动机(finiteautomata)示例1.softwareforcheckingdigitalcircuits。2.lexicalanalyzerofcompiler。3.softwareforscannin......
  • JavaScript之Promise补充与Dom操作
    Promise过程分析//按照顺序依次引入a-d.js,最后打印加载完毕load('a.js').then(()=>{returnload('b.js')//load方法返回Pomise对象//但是没有把这个对象返回//所以这个函数没有返回值//then方法会提供一个空对象作为返......
  • R语言--06文件读写read.table()、read.csv()
    1、读取-read.table()#文件读写部分#1.读取ex1.txtex1<-read.table("ex1.txt")ex3<-read.table("ex1.txt",header=T)看看有没有header的区别,以下是第一行代码的运行结果: 以下是第二行代码运行的结果:所以header=T的作用就是原本的文件已经给出了列名,不用重新再......
  • R语言---07作图plot()、ggplot()、boxplot()
     一、画图安装包如果你在运行代码过程中,报错显示R包不存在,则需要先安装R包再运行代码。本文需要用到的R包,用library()函数加载并检查一下你的电脑里面是否有该R包。library(ggplot2)library(ggpubr)library(eoffice)library(patchwork) 如果缺少R包,可以使用一下代码......