算法笔记【8】-合并排序算法

文章目录

    • 一、前言
    • 二、合并排序算法基本原理
    • 三、实现步骤
    • 四、优缺点分析

一、前言

合并排序算法通过采用分治策略和递归思想,实现了高效、稳定的排序功能。本文将深入探讨合并排序算法的原理、实现步骤,并讨论其优缺点。

二、合并排序算法基本原理

合并排序算法采用了分治策略,将一个大问题分解为若干个小问题,并通过递归地解决这些小问题来达到整体解决的目的。具体而言,合并排序首先将待排序的数组不断划分为两个子数组,直到每个子数组只包含一个元素,然后将这些子数组进行两两合并,同时按照大小顺序排列,最终得到完全有序的数组。

三、实现步骤

以数组为例,其算法流程原理如图所示。
在这里插入图片描述
由图可知,合并排序算法的实现步骤可大致分为三步:

  • 第一步-》递归划分:将待排序数组不断划分为两个子数组,直到每个子数组只包含一个元素。
  • 第二步-》合并操作:将两个有序的子数组合并为一个有序数组,同时按照大小顺序排列。
  • 第三步-》重复上述步骤,直到整个数组排序完成。

以下是使用matlab编写的合并排序算法示例代码:

  • 合并排序算法函数
%% 合并排序算法函数
function sorted_array = mergeSort(arr)
    % 检查输入数组是否为空或只有一个元素
    if length(arr) <= 1
        sorted_array = arr;
        return;
    end
    
    % 将输入数组分为两个子数组
    mid = fix(length(arr)/2);
    left_array = arr(1:mid);
    right_array = arr(mid+1:end);
    
    % 递归调用mergeSort函数对子数组进行排序
    left_sorted = mergeSort(left_array);
    right_sorted = mergeSort(right_array);
    
    % 合并两个已排序的子数组
    sorted_array = merge(left_sorted, right_sorted);
end

%% 子数组排序合并函数
function merged_array = merge(arr1, arr2)
    % 初始化指针和合并后的数组
    i = 1; j = 1; k = 1;
    merged_length = length(arr1) + length(arr2);
    merged_array = zeros(1, merged_length);
    
    % 比较两个数组的元素,并按顺序将较小的元素放入合并后的数组中
    while i <= length(arr1) && j <= length(arr2)
        if arr1(i) <= arr2(j)
            merged_array(k) = arr1(i);
            i = i + 1;
        else
            merged_array(k) = arr2(j);
            j = j + 1;
        end
        k = k + 1;
    end
    
    % 将剩余的元素复制到合并后的数组中
    while i <= length(arr1)
        merged_array(k) = arr1(i);
        i = i + 1;
        k = k + 1;
    end
    
    while j <= length(arr2)
        merged_array(k) = arr2(j);
        j = j + 1;
        k = k + 1;
    end
end
  • 调用
clc;
clear;
arr = [79,88,70,37,92,6,28,54];
%% 快速排序函数调用
sortedArr= mergeSort(arr);
disp("***********合并排序*****************************");
disp("排序前的数组:");
disp(arr);
disp("排序后的数组:");
disp(sortedArr);
  • 结果
    在这里插入图片描述

四、优缺点分析

优点:

  • 合并排序算法具有稳定性,相同元素的相对顺序不会改变。
  • 在平均情况下,合并排序的时间复杂度为O(nlogn),较低的时间复杂度保证了其高效性。
  • 可以处理大规模数据的排序,适用于各种数据类型。

缺点:

  • 合并排序算法需要额外的空间来存储中间结果,空间复杂度为O(n)。
  • 对于小规模数据,合并排序的性能可能略低于其他简单的排序算法,由于递归调用的开销。

结论:

合并排序算法通过巧妙地利用分治策略和递归思想,实现了高效、稳定的排序功能。它在实际应用中被广泛使用,并且适用于各种数据类型和规模。然而,在面对特别大的数据集时,需要考虑额外的空间开销。了解合并排序的原理和实现方式,对于深入理解分治策略以及扩展排序算法的知识面都是非常有益的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/109636.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文看懂完整的研究生生活规划

很多人在刚从本科步入研究生生活的时候,总是对于自己三年的研究生生活没有清晰的规划,总是在各种浪费时间,没有拿到想要的东西,也没有学到想学的东西,亦或是没有找到理想的工作,最后草草的毕业。这个时候我们就应该对于自己的研究生生活有个清晰的规划,帮助我们不留遗憾…

人大与加拿大女王大学金融管理硕士项目:开启国际视野,成就金融领袖

生活中&#xff0c;我们总会遇到各种各样的困难和挑战。有时候&#xff0c;我们会感到沮丧、迷茫甚至绝望。但是&#xff0c;正是这些困难和挑战&#xff0c;让我们变得更加坚强、勇敢和成熟。在这个职场竞争愈发激烈的时代&#xff0c;不断地充实自己是非常重要的。如果你从事…

IP代理被低估的作用,你知道吗?

IP说简单不简单&#xff0c;说复杂也不复杂&#xff0c;打个比方&#xff0c;IP就好比我们上网的一个门牌号&#xff0c;每家每户都会有一个门牌号&#xff0c;而且是唯一的地址。而代理IP&#xff08;代理服务器&#xff09;是一个位于中间的服务器&#xff0c;充当客户端和目…

centos部署tomcat

Java Downloads | Oracle 上面是下载网址 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台&#xff0c;安全域管理和Tomcat阀 简单来说&#xff1a;Tomcat…

【人口数据集总结】WorldPop、GWPv4等

1 全球人口数据WorldPop 数据详解可参见另一博客-【数据集8】全球人口数据WorldPop详解。 WorldPop是由南安普顿大学在2013年10月发起的全球人口数据评估,将AfriPop,AsiaPop和AmeriPop人口调查项目整合到一起。数据集已经被众多的组织和机构使用:联合国开发计划署,联合国…

【多线程相关其二】进程与线程

进程vs线程 进程&#xff08;process&#xff09;指的是正在运行的程序的实例&#xff0c;即an instance of a computer that is being executed。用拆字法理解就是&#xff1a;进行中的程序。程序是一个没有生命的实体&#xff0c;只有处理器执行它的时候才能成为一个活动的实…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

Spring Boot中配置默认的HikariCP数据源

在了解HiKari之前&#xff0c;我们需要先了解关于数据访问的相关概念&#xff1a; 什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言用于与数据库进行交互的标准API。它提供了一组类和接口&#xff0c;用于执行数据库操作&#xff0c;如连接…

JVM虚拟机:从结构到指令让你对栈有足够的认识

本文重点 在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说…

Elasticsearch:标量量化 101 - scalar quantization 101

作者&#xff1a;BENJAMIN TRENT 什么是标量量化以及它是如何工作的&#xff1f; 大多数嵌入模型输出 float32 向量值。 虽然这提供了最高的保真度&#xff0c;但考虑到向量中实际重要的信息&#xff0c;这是浪费的。 在给定的数据集中&#xff0c;嵌入永远不需要每个单独维度…

java项目之驾校预约管理系统(ssm框架)

项目简介 校预约管理系统实现了以下功能&#xff1a; 管理员&#xff1a;首页、个人中心、学员管理、驾校教练管理、驾校车辆管理、预约管理、取消预约管理、驾校公告管理、系统管理。驾校教练&#xff1a;首页、个人中心、驾校教练管理、预约管理、取消预约管理。学员&#…

编译环境里存在yaml-cpp的多个版本时可能引起的问题

有时要编译的程序自带了特定版本的yaml-cpp&#xff0c;同时系统目录下也安装了更高版本的yaml-cpp&#xff0c;这时可能引起编译错误&#xff0c;就是某些yaml-cpp的API不认识&#xff0c;例如&#xff1a; 出现这种问题倒好办&#xff0c;正常情况下不可能&#xff0c;肯定能…

【Unity PlasticSCM】记录:从介绍 下载 到拉取项目

实习的时候项目是svn管理的&#xff0c;这次mini的项目管理最后选择了美术策划友好的plasticSCM&#xff0c;但之前没有接触过&#xff0c;所以决定花费一点时间去了解&#xff0c;然后记录一下中间遇到的一些问题。 了解及下载Plastic b站很详细介绍PlasticSCM&#xff1a;Un…

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题

一、行业背景 随着国民经济的蓬勃发展&#xff0c;工业用电和居民用电需求迅速增加&#xff0c;电厂、变电站、输电线路高负荷运转&#xff0c;一旦某个节点发生故障&#xff0c;对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多&#xff0c;而生产监督员有限…

JMeter简单使用

JMeter是一个功能强大的开源性能测试工具&#xff0c;用于对各种应用程序、协议和服务器进行性能和负载测试。它被广泛用于测试Web应用程序的性能&#xff0c;并可以模拟多种负载条件和行为。 JMeter使用 添加线程组 设置线程组的配置 设置请求 配置请求 添加监听器 查看压…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2023年…

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞 一、蓝凌EIS简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现六、深度复现1、发送如花2、哥斯拉直连 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者…

一文教你解决git请求github时候超时的问题

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一文教你解决git请求github的时候超时问题 一. 问题二. 当前 ssh 实现原理三. 创建ssh key3.1 将ssh key加入github配置中3.2 测试连…

如何在 Mac 上切换用户?

如果您想与其他人共享您的 Mac&#xff0c;创建一个独立于您的个人帐户的新用户帐户可能会有所帮助。然而&#xff0c;不利的一面是&#xff0c;时不时地在不同的用户帐户之间切换可能是一件耗时的事情。幸运的是&#xff0c;我创建了本指南&#xff0c;解释如何在 Mac 上快速切…