堆排序与归并排序

python零基础入门到精通,python入门到精通教程 坚持到了这儿,恭喜你,表示你有做开发的潜力,其实我想说的上面的内容还是刚刚开始,刚开始大家不需要多么精通了解这些内容,除了Python方面的知识,每个部分掌握一点儿能进行基本开发就好,主要是不断练习,让自己跳出「舒适区」,进入「学习区」,但是又不进入「恐慌区」,不断给自己「喂招」。上述这份完整版的Python全套学习资料已经上传优快云官方,朋友们如果需要可以扫描下方二维码免费获取【保证100%免费】 阅读详情

、

 

 

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

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));

    }

}

 

lammps教程:非晶sio2建模方法 大家好,我是小马老师。 本文介绍非晶sio2的建模方法。 sio2的建模方法有很多,可以下载cif文件使用atomsk转为data文件,也可以直接在ms中导入sio2结构,这些方法建的sio2都是标准的sio2晶体。 如果要建立非晶状态的sio2,就是把排列规则的sio2变成无序排列的sio2。 非晶建模方法有很多,在lammps中,可以通过高温高压的方法打乱sio2的排列实现非晶建模。 代码中的温度和步数可根据需要自己调整。 下面给出in文件案例代码。 units metal atom 阅读详情

相关推荐

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1608

堆排序和归并排序

各种排序放大的时间复杂度,空间复杂度,以及稳定性 三中排序的移动次数比较 堆排序的时间复杂度为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

STM32MP157+AD7606BSTZ四通道IEPE传感器控制器实战(附电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器控制器设计实战,涵盖硬件架构、数据采集芯片对比、关键电路设计及信号处理算法。通过双核协同工作和优化算法,实现高精度振动监测与故障诊断,适用于工业机械状态监测等场景。

weixin_29171129的博客 363

面试题:利用堆排序实现从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

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试和健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 353

量子-经典混合架构与动态QUBO建模

量子-经典混合架构与动态QUBO建模的结合,是当前量子计算与经典计算融合领域的前沿方向。通过将量子计算的并行性与经典计算的灵活性结合,该技术为解决复杂动态优化问题(如实时调度、金融投资组合优化、电力系统控制等)提供了全新的方法论。:将发电机组调度分解为QUBO(启停决策)与非QUBO(功率分配)子问题,通过3块ADMM协调;c_i(t) $随外部环境(如电力需求、市场价格)动态调整。量子-经典混合架构与动态QUBO建模的结合,标志着优化计算从。:每分钟根据市场波动调整QUBO的收益率-风险系数;

百态·数智思维 | 聚焦大数据、量化与未来AI 1334

堆排序和归并排序笔记

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

lx127372的博客 713

R语言中5种正态性检验的方法

统计学中的t检验和方差分析等方法的应用条件是样本都来自正态总体或近似正态总体,只有符合这个条件,才能用这些方法来检验各样本所属的总体参数的差异显著性。文本向大家介绍在R语言中检验正态性的几种方法: 1、Kolmogorov-Smirnov检验 K-S检验检验单一样本是否来自某一特定分布。比如检验一组数据是否为正态分布。它的检验方法是以样本数据的累积频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。K-S检验的原假设和备择假设为: H0:样本所来自的总体分布服从

Mrrunsen的博客 2万+

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

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

2301_77053417的博客 2992

最新扣子智能体教程:手把手教你接入抖音评论区,实现自动回复

摘要:本文介绍如何利用扣子(Coze)平台搭建智能体实现抖音评论自动回复。从准备工作(账号注册、权限申请)到智能体创建(提示词优化、模型选择),再到抖音API接入和自动回复逻辑设置,详细说明了每个步骤的操作方法。文章还提供了回复模板示例和优化建议,帮助提升互动效率。通过这套方案,创作者可以显著减轻评论区管理压力,增强用户互动体验。(149字)

互联网架构师笔记 984

stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3384

堆排序,归并排序

堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为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

Linux ARM平台开发系列讲解(LED) 2.1.1 如何点亮一个LED之添加设备树信息

1. 设备树添加设备信息 我拿到的开发板上有两颗LED供用户编程使用,分别是GPIO5_IO8和GPIO5_IO9,设备信息如下,不同板子的设备定义不同,根据自己的实际情况进行添加。 2. 编译设备树 根据自己拿到的SDK,执行编译命令,我这里拿到的SDK编译脚本为: ./build.sh kernel 3. 使用uuu工具烧录新编译好的内核 因为imx8 SDK设备树和内核是统一编译成一个镜像,所以只需要烧录内核,设备树文件也会烧录。 sudo uuu -b emmc imx-kernel.bin

DSMGUOGUO的博客 918

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

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

不舍驽马 8364

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

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

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

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

未见花闻的博客 1490

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

堆排序和归并排序 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

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

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

归并排序与堆排序

文章目录归并排序思想代码测试分析堆排序(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、付费专栏及课程。

余额充值