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

什么是数据结构?什么是算法?我该怎么学习数据结构与算法? 01 前言 学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策略,以及这些算法的原理和他背后的思想,最后会动手写代码,用java里的数据结构来实现这些算法,如何去做? 02 基本概念回顾 2.1 什么是数据结构? 1)概述 数据结构是计算机存. 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/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

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

🏆LeetCode215. 数组中的第K个最大元素https://blog.youkuaiyun.com/grd_java/article/details/136932454
class Solution {
	//通过小根堆,获取nums中最大的k个值,并返回这4个值中最小的那个
    public int findKthLargest(int[] nums, int k) {
        int[] minHeap = new int[k];//小根堆
        for (int i = 0; i < k; i++) {//大小为k
            minHeap[i] = nums[i];
        }
        //k/2-1是二叉树的知识,代表以k个结点构成的二叉树的第一个非叶子结点。k/2-2是第二个非叶子,以此类推。i == 0是整个二叉树的根结点
        for (int i = k / 2 - 1; i >= 0; i--) {//调整小根堆,从下到上,依次让每一颗子树满足小根堆
            adjustHeap(minHeap, i);//i是二叉树的每个非叶子结点,小根堆的要求是:每个子树,根结点都是整棵树最小
        }
        //小根堆构建完成后,minHeap[0]就是当前第k大的数。接下来需要不断进行判断和入堆操作
        for (int i = k; i < nums.length; i++) {
            if (nums[i] > minHeap[0]) {//如果当前i,是比小根堆堆顶更大的元素,那么堆顶不是第k大,
                minHeap[0] = nums[i];//将堆顶出堆,并将i放在堆顶位置
                adjustHeap(minHeap, 0);//此时很有可能小根堆逻辑被破坏,也就是i太大,不满足小根堆,因此需要让i进行下降调整,让其重新满足小根堆定义
            }
        }
        return minHeap[0];
    }

    /**
     * 以root为根结点构建/调整堆
     * @param array 堆
     * @param root 当前根结点
     */
    private void adjustHeap(int[] array, int root) {
        //让root结点下降到合适位置,以满足小根堆效果(任何一颗子树,根结点都是最小的)
        while (true) {//当堆调整完成后,结束
            int left = 2 * root + 1;//获得root的左子结点下标
            int right = left + 1;//获得root的右子结点下标
            int min = root;//最小值,最终需要放到root结点位置
            //如果左子结点存在,并且左子结点更小,让min指向这个结点
            if (left < array.length && array[left] < array[min]) min = left;
            //如果右子结点存在,并且右子结点更小,让min指向这个结点
            if (right < array.length && array[right] < array[min]) min = right;
            //如果min == root说明小根堆调整结束
            if (min == root) break;
            //让min当前指向位置和root交换,也就是下降操作,说明root当前指向的结点不是最小值,不满足小根堆
            //因为小根堆,越上面层次的结点,越小,所以如果当前root太大,需要让其下降
            swap(array, root, min);
            //root本次下降完成后,min的位置是root新的位置。因为root下降到min的位置
            //让root指向min,然后继续循环,判断是否root需要继续下降。直到它下降到合适位置
            root = min;
        }
    }

    private void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

相关推荐

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet),有灵活的接口规范与开放生态。采用对商用友好的 Apache 2.0 开源协议。

向往自由的少年!(我是一个少年!!!) 1700

Java——数据结构与算法(堆排序)思路解析 基础学习

堆排序 堆排序的基本介绍: 堆排序利用堆这种数据结构而设计的一种排序算法,时间复杂度都为O(nlogn),也是不稳定排序。 大顶堆:每个结点的值都不小于孩子结点的值(无左右孩子结点的关系)。 小顶堆:每个结点的值都不大于孩子结点的值 升序排序用大顶堆,降序排序用小顶堆。 基本思想: 将待排序序列构造成一个大顶堆 此时,整个序列的最大值就是堆顶的根节点。 将其与末尾元素进行交换,此时末尾就为最大值。 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列

Pausch的博客 175

FastAdmin框架Token验证实战:从登录到API调用的完整流程

本文详细解析了在FastAdmin框架中实现Token验证的完整流程,从数据表设计、登录接口签发Token,到核心验证中间件的编写与路由配置,并探讨了在业务API中的调用与安全实践。内容涵盖Token生成策略、有效期管理及安全增强措施,为开发者提供了一套可落地的API身份验证解决方案。

nnn11的博客 918

数据结构与算法基础-堆排序(Java)

/** * @author lixin * @date 2019/3/23 - 17:32 */ import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] arr = new int[]{9, 6, 8, 7, 0, 1, 10,...

每天都要加油鸭 194

Unity2018连接MySQL数据库

当前在做的一个Unity项目需要连接到MySQL数据库,弄了一整天,排了很多错,终于在Unity上成功连接到MySQL数据库了,所以分享一下,避免有这个需求的朋友不用花那么多时间。 我使用的软件是 Unity20184.0f1 + mysql-8.0.24 导入 MySql.Data.dll 首先需要把 MySql.Data.dll 导入到Assets/Plugins 这个dll需要安装Connector/NET,在安装目录\Assemblies\v4.0中拿到,最好不要下载版本太高的,版本太高导入的时候

ZLX的博客 9452

Keil MDK v6迁移指南:从AC5到AC6的编译器升级与工程适配

编译器是嵌入式开发的底层基石,决定了代码的执行效率与工程的可维护性。随着ARM工具链向LLVM/Clang架构演进,Arm Compiler 6(AC6)正逐步取代经典的AC5,成为Keil MDK的核心编译引擎。AC6在C11标准支持、代码优化、诊断信息及LTO链接优化上全面超越AC5,但迁移过程中往往伴随内联汇编重写、类型检查严格化、库兼容性等问题。理解编译器差异、掌握CMSIS-Toolbox的工程描述机制,能帮助嵌入式工程师在Cortex-M系列项目中平滑过渡。本文结合Cortex-M4量产工程实战

weixin_29189363的博客 242

堆排序算法的Java实现与分析

1、堆排序算法的简单介绍 顾名思义哈,堆排序算法就是使用堆这种数据结构设计的一种排序算法,关于堆排序算法网上能找到太多的的资料讲解,但我是为了自己学习自己理解来写的博客,所以我呢只在我的博客中记录关键的一些知识点。 堆排序算法的关键知识点: 时间复杂度:在最好、最坏、平均情况下的时间复杂度都是O(nlogn); 稳定性:是一种不稳定的排序算法 堆分为大根堆和小根堆,相应的堆排序算法分...

weixin_30335353的博客 186

还在手敲LaTeX公式?用Rime小狼毫打造你的专属数学输入法(附完整配置包)

本文介绍如何利用Rime小狼毫输入法引擎打造专属数学公式输入方案,显著提升LaTeX公式输入效率。通过详细配置教程和智能补全技巧,帮助科研人员和学生实现3-5倍的输入速度提升,特别适合学术写作和技术文档创作场景。

weixin_32520601的博客 283

Java进阶【十五】数据结构与算法的应用

​ 学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。​ 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策略,以及这些算法的原理和他背后的思想,最后会动手写代码,用java里的数据结构来实现这些算法,如何去做?​ 本文基本知识概念有借鉴《漫画算法-小灰的算法之旅》相关篇幅与图片。1)概述。

jcc4261的博客 806

Windows11家庭版开启虚拟化与WSL安装操作手册

Windows 11 家庭版完全支持 WSL 2,无需升级到专业版即可享受 Linux 开发环境。通过本手册介绍的步骤,您可以顺利安装和配置 WSL,并掌握系统更新后的维护技巧。WSL 为开发者提供了在 Windows 环境下使用 Linux 工具链的便利,尤其适合需要跨平台开发的场景。随着使用深入,您会发现 WSL 生态系统的强大之处,它不仅能提高开发效率,还能让 Windows 用户体验到 Linux 的强大功能。建议定期查看微软官方文档,了解 WSL 的最新功能和最佳实践。

m0_54846764的博客 3028

【网络安全】Python代码审计高危函数与安全审计建议

Python 灵活且动态的特性使得开发便捷,但同时也带来了严重安全隐患。如果开发者缺乏安全意识,极易引入命令执行、反序列化漏洞及模板注入漏洞。本文总结了 Python 中常见的高危函数、模块和第三方库,并给出对应的审计建议及其原理解析,供安全研究人员和开发者参考。

等风来 418

数据结构排序算法

直接插入排序(Insertion Sort)是一种简单的排序算法,其主要思想是把待排序的元素插入到已经排好序的部分中,从而得到一个新的有序序列。直接插入排序的时间复杂度为,其中 n 表示数组的长度。当数组已经有序时,时间复杂度为 O(n)。关于比较次数,最坏情况下,即待排序的序列为逆序时,直接插入排序的比较次数最多。具体来说,对于长度为 n 的数组,最坏情况下的比较次数为 ,即大约为。在最好情况下,即待排序的序列已经有序时,直接插入排序的比较次数仅为 n-1。

qq_61726001的博客 1556

Codex 实战 Skills:如何用 Skill 让 AI 模拟人工点击,自动完成复杂的前端表单测试

本文介绍如何构建基于Selenium WebDriver的AI Agent技能,实现自动化UI测试流程。主要内容包括: 环境搭建:配置无头Chrome浏览器环境,使用WebDriver Manager自动管理驱动 核心技能开发:通过ID、CSS Selector、XPath等策略定位元素,实现显式等待机制 交互模拟:使用ActionChains模拟鼠标悬停等复杂操作 稳定性优化:解决异步加载问题,确保测试可靠性 Skill封装:将功能模块化,使AI能通过自然语言指令操作Web界面 该方案突破了传统自动化测试

yueyeguzhuo的专栏 150

数据结构排序算法实验报告_手敲一遍数据结构和排序算法

排序算法性质记忆冒泡排序选择排序插入排序快速排序归并排序希尔排序堆排序数据结构数组堆栈队列链表二叉树二叉搜索树图哈希表搜索广度优先搜索深度优先搜索附件排序算法代码图解Java数据结构和算法.pdf​sxf1024.lanzoui.com排序算法性质记忆1、关于稳定性不稳定: 快选堆希(快速排序、选择排序、堆排序、希尔排序)稳 定: 插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排...

weixin_39665507的博客 2428

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java 数据结构与算法

Java中算法是使用Java语言实现的计算方法和逻辑流程。数据结构是指在计算机内存空间或磁盘中存储的一系列具备特定操作和特性的数据组织模型。评判一个算法的好坏一般是通过时间复杂度和空间复杂度作为的评判标准。

x_y_x_520的博客 858

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

十大经典排序算法

相信大家都知道数据结构与算法的重要性了,排序算法是《数据结构与算法》中最基本的算法之一,接下来就让我们一起复习一下排序算法吧(其实也是自己忘的差不多了,顺便也温习一下),用一张图概括: 2.选择排序 2.1 算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 2.2 动画演示 3.希尔排序 3.1 算法步骤 选择一个增量序列 t1,t2,……,tk,其中 ti >

qq_45950443的博客 397

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构与算法之归并排序

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。你的支持,我的动力;祝各位前程似锦,offer不断!!!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!你的支持,我的动力;祝各位前程似锦,offer不断!!!

erthrerg的博客 676

Java数据结构与算法——排序篇

Java数据结构与算法: https://blog.youkuaiyun.com/weixin_46822367/article/details/115478461?spm=1001.2014.3001.5502. 目录1、==冒泡排序==2、选择排序3、插入排序4、希尔排序5、==快速排序==6、归并排序7、基数排序8、堆排序 1、冒泡排序 package com.lyp.sort; import java.text.SimpleDateFormat; import java.util.Arrays; impo.

weixin_46822367的博客 258

最全万字《算法和数据结构PDF》零基础算法入门到精通最建议阅读版本,蚂蚁金服java面试题

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84688353的博客 363

Java数据结构与算法(五)——排序

排序

MY_NEW_LIFE的博客 224

使用Java实现数据结构和算法:排序、查找、图

数据结构和算法是计算机科学的两个基石,它们是解决各种复杂问题和优化计算机程序的关键工具。数据结构和算法的重要性体现在以下几个方面:提高程序效率:好的数据结构和算法可以让程序更快地运行,更有效地利用计算资源。例如,使用快速排序算法比使用冒泡排序算法可以大大减少排序时间。解决复杂问题:数据结构和算法可以帮助开发人员解决各种复杂问题,如图形处理、人工智能、大数据处理等。例如,使用适当的数据结构和算法可以使搜索引擎更好地处理用户查询,并返回最相关的结果。提高程序可靠性:使用正确的数据结构和算法可以避免程序运行时出现

Java技术攻略的博客 567

数据结构与算法之基数排序

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,算法与数据结构是必备不可少的。

weixin_42179304的博客 633

快速排序 挖坑_堆排序-快速排序-归并排序

8大排序说起来简单,思路也很清楚,但是写起来并不是那么容易-排序是算法的基础下面来说比较常用的排序的写法:堆排序快速排序归并排序冒泡排序1 堆排序算法步骤:1 创建一个堆 :传入长为N的数组,进行一次sort 将0到N中最大到放到堆首2 将堆首和堆尾交换,堆排序长度减13 直到堆排序长度变为1,排序结束举例子,小顶堆(Java的PriorityQueue是小顶堆)轮廓: public st...

weixin_30002803的博客 93

java排序算法总结

java排序算法总结 排序,这是一个很古老但是又很经典的问题,世界上有很多中优秀排序算法的实现,在这里,我总结了其他比较常用的几种排序算法 1.java排序算法一览 冒泡排序和基数排序 桶排序和计数排序 归并排序和快速排序 堆排序 插入排序和希尔排序 2.分类 3.比较 1.时间复杂度比较 算法 乱序时间复杂度 有序时间复杂度 插入排序 O(N^2) O(N) 希尔排序 ...

kevin的博客 3228

排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现

package sample; public class Sort {     /**      * 插入排序:把array[j]插入到0~j-1的有序序列上,j从第二个元素开始,把第一个元素看成有序序列      * @param array      */     public static void insertSort(int[] array)     {

u011919606的专栏 432
上一篇: java数据结构与算法刷题-----LeetCode215. 数组中的第K个最大元素
下一篇: java数据结构与算法基础-----字符串------正则表达式---持续补充中
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值