堆排序与归并排序

ArduSub深度调参指南:如何让水下机器人像鱼一样稳定游动 本文深入探讨了ArduSub水下机器人的深度调参策略,旨在解决ROV在水下晃动、响应迟钝等问题。文章系统解析了级联PID控制逻辑,并针对静水与水流环境,提供了具体的深度保持与姿态控制调参方法、实战日志分析技巧以及异常振荡处理方案,帮助用户实现水下机器人稳定、流畅的游动性能。 阅读详情

、

 

 

//每次将堆顶元素与最后的元素交换

public class HeapSort

{

    public static void heapSort(DataWrap[] data)

    {

       System.out.println("开始排序");

       int arrayLength = data.length;

       //循环建堆

       for (int i = 0; i < arrayLength - 1 ; i++ )//n-1次循环

       {

           //建堆

           builMaxdHeap(data , arrayLength - 1 - i);

           //交换堆顶和最后一个元素

           swap(data , 0 , arrayLength - 1 - i);

           System.out.println(java.util.Arrays.toString(data));

       }

    }

    //对data数组从0到lastIndex建大顶堆

    private static void builMaxdHeap(DataWrap[] data , int lastIndex)

    {

       //从lastIndex处节点(最后一个节点)的父节点开始

       for (int i = (lastIndex - 1) / 2 ; i >= 0  ; i--)

       {

           //k保存当前正在判断的节点

           int k = i;

           //如果当前k节点的子节点存在

           while (k * 2 + 1 <= lastIndex)

           {

              //k节点的左子节点的索引

              int biggerIndex = 2 * k  + 1;

              //如果biggerIndex小于lastIndex,即biggerIndex + 1

              //代表的k节点的右子节点存在

              if (biggerIndex < lastIndex)

              {

                   //如果右子节点的值较大

                  if(data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0)

                  {

                     //biggerIndex总是记录较大子节点的索引

                     biggerIndex++;

                  }

              }

              //如果k节点的值小于其较大子节点的值

              if(data[k].compareTo(data[biggerIndex]) < 0)

              {

                  //交换它们

                  swap(data , k , biggerIndex);

                  //将biggerIndex赋给k,开始while循环的下一次循环,

                  //重新保证k节点的值大于其左、右子节点的值。

                  k = biggerIndex;

              }

              else

              {

                  break;

              }

           }

       }

    }

    //交换data数组中i、j两个索引处的元素

    private static void swap(DataWrap[] data , int i , int j)

    {

       DataWrap tmp = data[i];

       data[i] = data[j];

       data[j] = tmp;

}

public static void main(String[] args)

    {

       DataWrap[] data = {

           new DataWrap(21 , ""),

           new DataWrap(30 , ""),

           new DataWrap(49 , ""),

           new DataWrap(30 , "*"),

           new DataWrap(21 , "*"),

           new DataWrap(16 , ""),

           new DataWrap(9 , "")

       };

       System.out.println("排序之前:/n"

           + java.util.Arrays.toString(data));

       heapSort(data);

       System.out.println("排序之后:/n"

           + java.util.Arrays.toString(data));

    }

}

 

 

归并排序

public class MergeSort

{

    //利用归并排序算法对数组data进行排序

    public static void mergeSort(DataWrap[] data)

    {

       //归并排序

       sort(data , 0 , data.length - 1);

    }

    /**

     * 将索引从left到right范围的数组元素进行归并排序

     * @param data 待排序的数组

     * @param left 待排序的数组的第一个元素索引

     * @param right 待排序的数组的最后一个元素的索引

     */

    private static void sort(DataWrap[] data

        , int left, int right)

    {

       if (left < right)

       {

           //找出中间索引

           int center = (left + right) / 2;

           //对左边数组进行递归

           sort(data, left, center);

           //对右边数组进行递归

           sort(data, center + 1, right);

           //合并

           merge(data, left, center, right);

       }

    }

    /**

     * 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序。

     * @param data 数组对象

     * @param left 左数组的第一个元素的索引

     * @param center 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引

     * @param right 右数组的最后一个元素的索引

     */

    private static void merge(DataWrap[] data

       , int left, int center, int right)

    {

       //定义一个与待排序序列长度相同的临时数组

       DataWrap[] tmpArr = new DataWrap[data.length];

       int mid = center + 1;

       //third记录中间数组的索引

       int third = left;

       int tmp = left;

       while (left <= center && mid <= right)

       {

           //从两个数组中取出小的放入中间数组

           if (data[left].compareTo(data[mid]) <= 0)

           {

              tmpArr[third++] = data[left++];

           }

           else

           {

              tmpArr[third++] = data[mid++];

           }

       }

       //剩余部分依次放入中间数组

       while (mid <= right)

       {

           tmpArr[third++] = data[mid++];

       }

       while (left <= center)

       {

           tmpArr[third++] = data[left++];

       }

       //将中间数组中的内容复制拷回原数组

       //(原left~right范围的内容复制回原数组)

       while (tmp <= right)

       {

           data[tmp] = tmpArr[tmp++];

       }

    }

    public static void main(String[] args)

    {

       DataWrap[] data = {

           new DataWrap(9 , ""),

           new DataWrap(-16 , ""),

           new DataWrap(21 , "*"),

           new DataWrap(23 , ""),

           new DataWrap(-30 , ""),

           new DataWrap(-49 , ""),

           new DataWrap(21 , ""),

           new DataWrap(30 , "*"),

           new DataWrap(30 , "")

       };

       System.out.println("排序之前:/n"

           + java.util.Arrays.toString(data));

       mergeSort(data);

       System.out.println("排序之后:/n"

           + java.util.Arrays.toString(data));

    }

}

 

【论文+CAD图纸】光储充一体化微电网设计 近些年来,我国的经济发展迅速,对能源的需求不断增长,也加重了对环境的破坏,违背了我国的可持续发展战略。所以迫切需要寻找新型能源。由于太阳能在使用时不会产生污染,所以太阳能逐渐受到人们的重视。我国的太阳能资源丰富,具有的开发利用潜力。特别是近些年“光储充”一体化充电站为高科技绿色充电模式,“以光养桩”使光伏、储能、智能充电协同,智能微电网与公共电网互动,本设计对探索清洁可再生能源在民用场合的应用,有着重大的理论和工程价值。本文综述国内外相关光伏发电的成果和发展现状; 阅读详情

相关推荐

Mac 不小心断开移动硬盘导致磁盘无法读取和加载(顺利解决!)

Mac移动硬盘不正确断开连接导致无法读取加载的解决方法,亲测有效

Robin_Pi的博客 1万+

堆排序和归并排序

各种排序放大的时间复杂度,空间复杂度,以及稳定性 三中排序的移动次数比较 堆排序的时间复杂度为O(nlogn),无论好还他的时间复杂度是一样的  #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define MAXSIZE 10 typedef struct { int r[M...

糖炒栗子的博客 1538

华为路由器静态路由配置实战:从零搭建企业级网络环境(含常见错误排查)

本文以真实企业组网案例为基础,详细解析华为路由器静态路由的实战配置流程。内容涵盖从网络拓扑规划、IP地址分配到具体的`ip route-static`命令配置,并重点讲解了缺省路由、浮动路由等进阶应用。文章还提供了系统化的排错指南,帮助网络工程师规避回程路由缺失、子网掩码错误等常见问题,是掌握企业级网络搭建与维护的实用指南。

weixin_29313817的博客 89

面试题:利用堆排序实现从n个数字中找出前top-k大的数字

用堆排序(最小堆):top-k最大的数字 题目:top-k算法,从n个大小的数组中,找出k个最大的数字并输出 输入:数组大小n=10;k的值为5;数组为:9,8,3,2,10,20,13,1,5 输出:20,13,10,9,8 思路:1、维护k个最小堆,如果某个新进来的数字大于最小堆的根节点,那么将根节点换为新进来的数字,然后在对最小堆进行调整。 2、在找出k个大的数字后,对k个...

Mr.Cheng的博客 6678

基于文件通信的QMT量化交易信号桥接方案设计与实现

在量化交易系统开发中,进程间通信(IPC)是连接不同计算模块、实现策略逻辑与交易执行解耦的关键技术。其核心原理在于允许运行于独立环境或进程的程序安全、可靠地交换数据。文件系统通信作为一种经典的IPC方法,因其实现简单、跨平台兼容性好且数据可持久化,在非高频场景下具有重要技术价值。它尤其适用于需要将外部复杂计算环境(如配备丰富数据科学库的Python环境)与专用交易终端(如迅投QMT)集成的应用场景。通过约定文件路径与数据格式,外部程序可将包含交易指令的JSON信号文件写入特定目录,而交易终端通过轮询或监听机

weixin_28678151的博客 417

PyTorch深度学习实战(25)——从零开始实现Mask R-CNN实例分割

Mask R-CNN 是一种在目标检测任务中引入了语义分割的强大框架,通过在 Faster R-CNN 基础上进行扩展,添加了额外的分支网络,不仅可以准确地检测对象的位置和类别,还可以生成每个实例的精确像素级别的语义分割掩码。其模块化的设计可以轻松地应用于不同的任务和数据集,并且可以通过添加更多的分支进行功能扩展,如实例关键点检测等。

盼小辉丶的博客 1万+

堆排序和归并排序笔记

堆排序 堆排序是对选择排序的改进 时间复杂度是 O(nlogn),大概思路是: 将待排序的数列构造成大顶堆或者小顶堆 大顶堆就是每个结点的值大于左右孩子的值 此时,整个数列的最大值就是堆顶的根节点(将其与末尾交换) 然后将剩余的n-1个序列重新构造成一个堆 反复进行 上代码: /* =======================================================...

lx127372的博客 713

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1390

堆排序、快速排序和归并排序

快排的思想、Hoare版分割法、挖坑法分割法、如何优化快速排序。

2301_77053417的博客 2992

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 716

GD32F4xx MCU ADC+DMA 多通道采样

1、GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器。 1.1 主要特征 可配置12位、10位、8位、6位分辨率; ADC采样率:12位分辨率为2.6MSPs,10位分辨率为3.0 MSPs。分辨率越低,转换越快; PS: MSPs (模拟混合信号转换速率),是指完成1次从模拟转换到数字的AD转换所需的时间的倒数。常用单位是ksps和Msps,表示每秒采样(千)/(百万)次(kilo / Million Samples per Second)。 1msps

madao1234的博客 8117

堆排序,归并排序

堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 因为这种排序方式为堆排,所以肯定要先创建一个堆 堆排序分为两个步骤: 1、堆排序需要一个大顶堆(每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆) void heapify(int tree[],int n,int i) { int max = i; int c1 = 2 * i + 1; int c2 = 2 * i + 2;

weixin_45868783的博客 446

【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式

TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。图像存储:TIFF格式可以存储多通道的位图图像,包括灰度图、彩色图和透明度图等。它支持不同的像素深度,可以是8位、16位、24位或32位等。因此,TIFF格式非常适合存储高质量的图像数据,包括照片、卫星图像、医学影像等。无损压缩:TIFF格式支持无损压缩,这意味着图像可以被压缩而无需损失任何像素信息。这种压缩方式可以减小文件大小,而不会降低图像的质量。

智慧空间实验室 2819

快排与堆排序、归并排序的比较

快排while循环是永真循环,而归并却不是,归并多做了N*LogN次比较,归并会做几乎完美的分割,效果较快排好,但是多计N*LongN,归并反而慢 好像要比快排多花40%的时间 归并理论上效率很好,但是在while循环时,要判断是否出界,多做n*logn次比较,还要把数据拷贝回去,速度明显慢于快排。 我们刚才讨论归并理论上更快,就是指归并可以把序列分成两个几乎相等的子序列,无论怎样的快排

不舍驽马 8364

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【JavaSE与数据结构】排序算法之堆排序与归并排序

本篇文章带大家认识排序算法——堆排序与归并排序,堆排序在讲解堆和优先队列的时候已经将原理介绍了一点点,并使用优先级队列实现了堆排序,本文将使用建堆和向下调整的方式实现堆排序,每种排序算法都有一个核心,向下调整是堆排序的核心,而归并排序的核心就是合并两个有序的数组,实现代码语言为java。

未见花闻的博客 1490

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

堆排序和归并排序 java代码实现

文章目录堆排序java代码实现单元测试归并排序java代码实现单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort; import java.util.List; /** * Title: 抽象出排序类 * Description: * * @version 1.0 * @author: weijie * @date: 2020/10/22 17:59 */ public abstract class Sort<E> { pu

dreamzuora的博客 538

归并排序与堆排序

文章目录归并排序思想代码测试分析堆排序(Heap Sort)堆的定义思想实现测试分析 归并排序 思想 排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序采用的是分治思想。 分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 注:x >> 1 是位运算中的右移运算,表示右移一位,等同于 x 除以 2 再取整,即 x >> 1 === Mat.

一天不看代码浑身难受 1051

排序算法总结——堆排序和归并排序

前面介绍了插入排序和shell排序,今天我们来看看堆排序和归并排序。 堆排序 说起堆排序,先来说一下堆。堆分为大根堆和小根堆,大根堆就是一颗双亲节点元素大于孩子节点元素的二叉树,小根堆正好相反,是一颗双亲节点的元素小于孩子节点元素的二叉树。 **堆排序的思想是先利用数据建立大根堆,然后再将根元素放置最后保存起来,然后不断调整大根堆,将新的跟插入到旧根的前面,直至将最后一个元素保存,这样保存的元素将...

love10_1314的博客 481

堆排序和快排与归并排序

目录快速排序算法思想算法的优化代码实现归并排序算法思想算法优化代码实现堆排序算法思想代码实现 本文主要介绍了三个排序算法的思想原理和Java代码实现 快速排序 快排序的一个优点是其原地排序的特性,通过反复的交换元素,直接在数组中进行操作,只需要分配较少的内存来用于中间计算。 最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn) 算法思想 快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。 通过划分成多个子部

qq_44830792的博客 1762

python堆排序、归并排序

'''堆排序''' #构造大根堆 def createHeap(mylist,index,heap_size): #建立堆的起始索引 largest = index #左右孩子结点 left_child = 2 * index + 1 right_child = 2* index + 2 #判断左右孩子索引是否超出索引;并且比较值的大小 ...

qq_45061361的博客 253

堆排序、归并排序、快速排序总结

昨天刚把这三个排序算法复习了一遍,其中归并排序和快速排序特别的重要,一定要熟练并理解透彻! 以下排序的结果都默认为非递减   1、堆排序(默认大顶堆) 堆排序的思想:首先构建一个完全二叉树,从最大的非叶子结点,如果该结点小于孩子结点,则把该结点与最大的孩子结点交换,使该结点不断的往下沉到合适位置。然后又从第二大的非叶子结点开始,不断循环下去直到根节点,这时候便构造出了大顶堆,最后根结点就是...

Tseng 2090

归并排序算法、堆排序算法详解

一、归并排序算法 基本思想:   归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序示例:     合并方法: 设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为m-i +1、n-m。 j=m+1;k=i;i=i; //置两...

文轩的博客 461

归并排序和堆排序 java实现

归并排序 官方介绍 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 用自己的话形容:给一个无序集合数组,使用分治思想,二分法进行拆分,将大问题拆分成小问题,从上往下把问题集合缩小到一,再从下往上,陆续把两个集合归并。从而得到一个有序集合。它的时间复杂性是O(n

chudaxiakkk的专栏 299

【数据结构】排序(3)—堆排序&归并排序

思想方法:从最后一个元素开始(视为父节点),先找其孩子节点(左孩子或右孩子),与其孩 子结点比较,与大的一方(左孩子或右孩子)交换;思想方法:从第一个结点开始(视为左孩子或右孩子),先找该结点的父结点,在与父节点比较,大的与父结点交换,成为新的父节点;③ 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应置;比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

HZ_ENG的博客 2384

Day 23.24 堆排序与归并排序

堆排序 什么是堆? 堆一般都指的是二叉堆,它满足二个特性: 1、父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2、每个结点的左子树和右子树都是一个二叉堆(都是大顶堆或小顶堆)。 如下为一个小顶堆(父结点的键值总是小于任何一个子节点的键值) 由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或二叉树的根)必为序列中n个元素的最小值(或最大值)。  若在输出堆顶的...

j_xianyu的博客 251
上一篇: 反射调用主方法异常解决
下一篇: N个鸡蛋M个篮子
easyjsf
博客等级 码龄17年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值