经典算法(5)-归并排序

十大经典算法的Python实现及详解 阅读详情

经典算法(5)- 归并排序

概述

归并排序是采用分治法的一个非常典型的应用,是建立在归并操作上的一种有效排序算法,它是通过尽可能的将一组数据拆分成两个元素个数相等的子组(只是尽可能的个数相等),并且对每一个子组继续拆分,直到拆到每个子组的个数都是1为止,然后再将相邻的两个子组合称一个大的有序子组,然后不断重复合并的步骤,直到最终只有一个组为止,其实字面上看该排序算法不难想象,无非就是把数组拆个一个一个的元素,然后相邻再排序然后再合成,直到成一个数组,但是代码实现起来还是有一些细节的。

图解

在这里插入图片描述
如上图是分的过程,原数据是[5,6,2,4,8,3,7,1]第一次把原数据分成两组[5,6,2,4]和[8,3,7,1]。第二次把两组数据分成四组[5,6],[2,4],[8,3],[7,1]。最后一次把每个数据都分成独立的一组5,6,2,4,8,3,7,1。
在这里插入图片描述
如上图是治的过程,不难发现,排序的过程都是在治的时候进行的,第一次,把独立一组的每个元素,每相邻两个进行排序并合并,变成四组元素5,6变成[5,6],2,4变成[2,4],8,3变成[8,3],7,1变成[7,1]。第二次,每相邻两组排序并且合并成一组,总共两组,[5,6],[2,4]变成[2,4,5,6],[8,3],[7,1]变成[1,3,7,8]。第三次,每相邻两组排序并且合并成一组,总共一组,[2,4,5,6],[1,3,7,8]变成[1,2,3,4,5,6,7,8]。

代码

public class Merge {
    //辅助数组
    private int[] assist;
    //对数组array进行排序
    public void sort(int[] array){
        //初始化辅助数组assist,数组长度和待排序数组长度一样即可
        assist = new int[array.length];
        //定义一个lo变量和hi变量,分别记录数组中最小和最大的索引
        int lo = 0;//第一个数的索引为0,所以定义lo的初始值为0
        int hi = array.length - 1;//最后一个数的索引为array.length - 1,所以定义hi的初始值为array.length - 1
        //调用sort重载方法完成数组array中,从索引lo到索引hi的元素排序
        sort(array,lo,hi);
    }
    //对数组array中从lo到hi进行排序
    private  void sort(int[] array,int lo,int hi){
        //需要做安全性校验,排序的
        if(hi<=lo){
            return;
        }
        //对lo到hi进行分组
        int mid = lo+(hi-lo)/2;//例如lo是5,hi是9.那么mid是7
        //分别对每一组进行分组和排序
        sort(array,lo,mid);
        sort(array,mid+1,hi);
        //在把两个组进行归并
        merge(array,lo,mid,hi);
    }
    //对数组中,从lo到mid为一组,从mid+1到hi一组,对这两组进行归并
    private void merge(int[] array,int lo,int mid,int hi){
        //定义三个指针,作用是指向左右数据当前比较的数据以及辅助数据当前的索引位置
        int i = lo;
        int p1 = lo;
        int p2 = mid+1;
        //遍历,移动p1指针和p2指针,比较对应索引处的值,找出小的放到辅助的指针索引处
        while(p1<=mid && p2<=hi){
            //比较指针索引处的值
            if(array[p1]<array[p2]){
                assist[i] = array[p1];
                //放完后p1和i要往后挪一位
                i++;
                p1++;
            }else{
                assist[i] = array[p2];
                i++;
                p2++;
            }
        }
        //遍历,如果p1的指针没有走完,那么顺序p1的指针  ,把对应的数据写进辅助数组
        while(p1<=mid){
            assist[i] = array[p1];
            i++;
            p1++;
        }
        //遍历,如果p2的指针没有走完,那么顺序p2的指针  ,把对应的数据写进辅助数组
        while(p2<=hi){
            assist[i] = array[p2];
            i++;
            p2++;
        }
        //把辅助数组的元素拷贝到原数组里
        for (int j = lo; j <= hi; j++) {
            array[j] = assist[j];
        }
    }
}

时间复杂度

归并排序的时间复杂度为O(nlogn);

四大经典算法思想 上图就是一个回溯算法的思路,即先在第一行放置一个皇后,然后再试探性地再第二行放置一个皇后,以此类推,如果出现不满足要求的情况,则及时止损,返回上一行继续试探性地选择不同的方案,直到所有的方案都被列举出来位置。分治算法字面上的解释是“分而治之”,就是把一个复杂的问题拆分成两个或多个相同或相似的子问题,再把子问题拆分成更小的子问题......直到最后子问题可以简单地求解,原问题的解即子问题的解的合并。动态规划的思想是,若要解决一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。.. 阅读详情

相关推荐

旋转因子量化仿真

在单bit接收机中,通过量化FFT核函数来简化计算,将复数坐标中旋转因子单位圆上的点近似到正方形四个边上,就能够用累加实现复数乘法,从而避免使用DSP乘法器。通过仿真查看不同阶的核函数简化效果。

CyberInversion的博客 3102

C语言简单算法之指针,以二维数组形式对5个字符串进行排序

一、学习内容总结 每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既可以指向变量,也可以指向数组元素。我们把某一元素的地址放到一个指针变量中,数组元素的指针就是数组元素的地址。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。一个指...

low666的博客 8024

【DeepSeek+Office/WPS】智能办公新时代的全新利器

DeepSeek是一家专注于通用人工智能技术研发的中国科技公司,其核心产品DeepSeek-R1是一款开源的推理大模型,专注于复杂任务的高效处理,支持智能对话、文本生成、语义理解、计算推理、代码生成与补全等多种应用场景。作为国产、免费、开源且强大的AI平台,DeepSeek不仅致力于为终端用户提供高质量的智能服务,还为开发者提供了一整套完善的技术解决方案,帮助他们快速构建和部署自己的智能应用。

2303_77200324的博客 2790

排序算法 #5 归并排序

欢迎来到算法小课堂,今天讲解的内容是归并排序。归并排序中有两个核心思想:一是归并,二是分治。接下来我们就一一看下何为归并,何为分治。01合并两个有序数组现在有两个有序数组,分别是数组F=...

简一未 263

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 172

HFSS求解器背后的数学原理:从麦克斯韦方程到S参数计算

本文深入解析了Ansys HFSS求解器的数学原理,从麦克斯韦方程出发,详细介绍了模式驱动求解(Driven Solution)和本征模求解(Eigenmode)等核心算法。通过有限元方法和模式匹配技术,HFSS将电磁场问题转化为矩阵方程求解,实现S参数计算和场分布分析,为工程师提供精确的电磁仿真工具。

weixin_28314575的博客 464

五 归并排序

此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。 1. 概述: 要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。 2. 算法: 实现归并的一种直截了当的方法是将两个不同的有序数组归并到第三个数组中,两个数组的元素应该都实现了 Comparable 接口。但是,当归并将一个大数组排序的时候,我们需要进行很多次归并,因此不能采取每次归并时都创建一个新数组来存储排序结果的方式。更希望有一种原地归并的方法,这样就可以先将前半部分排序,再将后半部分排序,然后在数组

paynmind的博客 427

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 405

c语言二维数组 逐个比较a,b两个字符串对应位置中的字符,C语言程序设计模拟试题A(附答案)...

《C语言程序设计》模拟试卷A一、单项选择题(每题2分,共20分)1、下列有关C语言的叙述中错误的是(D)。A) C语句必须以分号结束B) 任何一个C程序中有且只有一个主函数C) 复合语句在语法上可被看作一条语句D) C程序中对数据的任何操作都可由运算符实现2、以下不能定义为用户标识符的是(C)。A) MAIN B) _HJ C) 2ong D) LINE13、以下能正确定义一维数组的是(C)。A)...

weixin_33976326的博客 478

RLHF的数学表示

RLHF(Reinforcement Learning with Human Feedback)是一种结合了强化学习和人类反馈的机器学习方法。它通常用于训练智能体(agent)在复杂环境中做出决策,同时利用人类的反馈来指导和改进学习过程。RLHF 没有一个统一的数学表示式,因为它依赖于具体的应用场景和实现细节。然而,我们可以从强化学习和人类反馈的角度来描述RLHF的一些关键数学概念。

xw555666的博客 687

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 509

C语言(五)

C语言中的二维数组 ====================== 1. 一维数组 int a[10]; 一维数组 int a[5][6]; 二维数组 肤浅的认识: 当成数学中的矩阵理解,行和列 char b[5][20]; 二维数组 2. 二维数组在计算机中的存储 跟一维数组一样,也是线性存放的,一个元素挨着一个元素(没有行列说...

qq_40979987的博客 461

100个Python实战项目(七)实现摩斯密码翻译器

作者主页:海拥 作者简介:优快云全栈领域优质创作者、HDZ核心组成员、蝉联C站周榜前十 粉丝福利:往期获奖记录 每周送6~9本书,不定期送各种小礼品(搪瓷杯、抱枕、鼠标垫、马克杯等) 摩斯密码是一种将文本信息作为一系列通断的音调、灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译。它以电报发明者Samuel F. B. Morse的名字命名。 算法 算法非常简单。英语中的每个字符都被一系列“点”和“破折号”代替,或者有时只是单数的“点”或“

努力是为了站在万人之中,成为别人的光 1万+

程序员必须掌握的十大经典算法

程序员必须要掌握的十大经典算法 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and...

Androidyuexia的博客 4122

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

python经典算法大全,python经典算法题

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。工作原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。选择排序是不稳定的排序方法。如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。

Night368的博客 1657

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

经典算法之归并排序

归并算法 归并算法的核心就是分而治之。 算法步骤 1.开辟一块空间,用于存放合并后的序列 2.设定两个指针,起始位置分别位于两个已排序序列的起始位置 3.比较两个指针所代表的元素,将更小的元素放入合并空间,并将指针后移 4.重复步骤3,直至有一个指针到达尾部 5.将另一个序列的剩余元素复制到合并序列尾部 直接上代码 public int[] sort(int[] sourceArray) { ...

墨玉浮白的博客 4955

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

经典算法回顾之归并排序

  归并排序是将两个或两个以上的有序子表合并成一个新的有序表。它的基本思想是分治法。对于二路归并而言,初始时将含有n个节点的待排序序列看作由n个长度为1的有序子表组成,将它们一次两两归并得到长度为2的若干有序子表,再对它们两两合并,知道得到长度为n的有序表,排序结束。   与快速排序和堆排序相比,归并排序的最大特点是,它是一种稳定的排序。归并排序可用顺序存储结构,也易于在链表上实现。对...

diezhuan0712的博客 140

你知道的C++经典算法有哪些

C++作为一门功能强大且广泛应用的编程语言,其在算法领域的应用十分广泛。掌握一些经典的算法不仅能够提高程序的效率,还能增强解决复杂问题的能力。本文将介绍一些在C++中广泛应用的经典算法,包括排序算法、搜索算法、图算法、动态规划等。

雨1986的博客 2193

经典算法(五)---归并排序

归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)和递归(Recursion)思想的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序分两大步,第一步分,第二步合。

code__01的博客 1959

【图解算法】经典算法之归并排序

//留坑 以后补充 #include<stdio.h> int T[100]; int len; void Merge (int a[],int low,int mid,int high) { int i=low,j=mid+1,k=1; while(i<=mid&&j<=high) { if(a[i]<a[j]...

greenhand_coder 2617

归并排序

归并排序介绍 归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案‘修补’在一起,即分而治之)。 package sort; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; ...

给你更好的 7749

算法系列5—归并排序

归并排序 归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好得多。但是需要额外的内存空间。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。 归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为2-路合并 时间复杂度平均为O(nlog2n),最好为O(nlog2n),最坏O(nlog2n),空间复杂度为O(n),是一种:稳定排序。 """ de

qq_42486675的博客 9129

归并思想的经典算法---归并排序

上一篇博客简单讲了一下分而治之的快速排序,那这篇讲一下另一种重要的算法思想归并思想,搬出了归并思想的经典算法示例归并排序。 一、思路分析 归并与分治的不同点在于核心不同,分治的核心在于分,而归并的核心在于合并,归并不管你这一刀往哪一划,我只在最终结果的合并把你给排好。 什么是归并排序 思路:归并排序重在最后的合并,划分直接中间切一刀就可以了。 第一步:以中间下标分开左右两数组 第二步:分别调用递归...

SuperYang的博客 530

算法之路_5、归并排序

一、解释 归并排序(merge—sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并,说白了就是分开,后合并。举个通俗的栗子:有一堆人,要按大小个排队。先把这一堆人分成两队,两队各自...

郭岚的博客 1万+

C语言经典算法之归并排序算法

归并排序是一种基于分治策略的经典排序算法,它的主要思想是将待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后将排好序的子数组合并成一个有序的数组。

weixin_56154577的博客 676

《算法之道》精华 经典算法部分

《算法之道》精华 经典算法部分 本书作者绉恒明,作者另有一本书《数据结构之弦》,以及《操作系统之哲学原理》都是很好的书这本书可以算得上是深入浅出,文笔很好,作者添加了很多自己的思考本文包括经典算法部分 第十章 排序与次序 插入排序 从无序部分抽取一张插入有序部分为原地排序,无需占用临时存储空间最优情况下为O(n),平均O(n^2) 折半插入排序 插入时使用二分查找 归

Focustc 1万+
上一篇: 经典算法(4)-希尔排序
磕瓜子
博客等级 码龄6年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值