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

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、归并排序的基本思想
      • 二、归并排序的步骤
      • 三、归并排序的实现
        • 1. 示例数组
        • 2. 伪代码
        • 3. Python 实现
      • 四、归并排序的时间复杂度分析
      • 五、归并排序的空间复杂度分析
      • 六、总结

引言

归并排序(Merge Sort)是一种经典的排序算法,采用分治策略来实现高效排序。它将待排序的数组分成两个部分,递归地对这两个部分进行排序,然后再将排序后的两部分合并成一个有序数组。归并排序的时间复杂度为O(n log n),并且是稳定的排序算法,这意味着相等的元素在排序前后相对顺序不变。本文将深入探讨归并排序的原理、实现步骤,并通过具体的案例代码详细说明归并排序的每一个细节。

一、归并排序的基本思想

归并排序的基本思想是:

  1. 分解:将数组分成尽可能小的子数组。
  2. 排序:对每个子数组进行排序。
  3. 合并:将排好序的子数组合并成更大的有序数组。

二、归并排序的步骤

假设有一个数组 arr 需要进行排序。

  1. 分解:如果数组长度大于1,则将其分成两个子数组。
  2. 递归排序:递归地对这两个子数组进行归并排序。
  3. 合并:将两个已排序的子数组合并成一个有序数组。

在这里插入图片描述

三、归并排序的实现

接下来,我们将通过一个示例来详细了解归并排序的实现步骤。

1. 示例数组

考虑一个整数数组 arr = [5, 2, 4, 6, 1, 3]

2. 伪代码

以下是归并排序的基本伪代码:

function merge_sort(arr):if length(arr) <= 1:return arrelse:mid = length(arr) // 2left = merge_sort(arr[0:mid])right = merge_sort(arr[mid:])return merge(left, right)function merge(left, right):result = []i = j = 0while i < length(left) and j < length(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
3. Python 实现

下面是一个使用Python编写的归并排序算法的具体实现:

def merge_sort(arr):# 如果数组只有一个元素或为空,直接返回if len(arr) <= 1:return arr# 分解数组mid = len(arr) // 2left = arr[:mid]right = arr[mid:]# 递归排序左右两部分left_sorted = merge_sort(left)right_sorted = merge_sort(right)# 合并两个有序数组return merge(left_sorted, right_sorted)def merge(left, right):result = []i = j = 0# 合并两个数组while i < len(left) and j < len(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1# 添加剩余的元素result.extend(left[i:])result.extend(right[j:])return result# 示例数组
arr = [5, 2, 4, 6, 1, 3]
# 调用函数
sorted_arr = merge_sort(arr)
print(sorted_arr)

四、归并排序的时间复杂度分析

  • 最好情况:无论数组的状态如何,归并排序的时间复杂度都是O(n log n)。
  • 最坏情况:无论数组的状态如何,归并排序的时间复杂度都是O(n log n)。
  • 平均情况:归并排序的平均时间复杂度也是O(n log n)。

五、归并排序的空间复杂度分析

  • 归并排序需要额外的存储空间来存放临时数组,因此其空间复杂度为O(n)。

六、总结

归并排序是一种高效且稳定的排序算法,特别适合处理大数据量的情况。在实际编程中,归并排序因其稳定的排序特性以及较好的时间复杂度,常常被用作排序算法的标准实现之一。在需要对大量数据进行排序时,归并排序是一个非常好的选择。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL笔记3——高级数据查询语句DQL

多表联查 多表联查可以通过连接运算实现&#xff0c;即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查 时用到的数据库表之间的关系。 等值查询和非等值查询 非等值查询&#xff1a;SELECT * FROM 表1&#xff0c;表2 等值查询&#xff1a;SELECT * FROM 表…

Oracle对比两表数据的不一致

MINUS 基本语法如下 [SQL 语句 1] MINUS [SQL 语句 2];举个例子&#xff1a; select 1 from dual minus select 2 from dual--运行结果 1-------------------------------- select 2 from dual minus select 1 from dual--运行结果 2所以&#xff0c;如果想找所有不一致的&a…

Codeforces Round 962 (Div. 3)

链接 C题&#xff1a; 思路&#xff1a; 直接暴力求每个字母的前缀和&#xff0c;对于区间l&#xff0c;r的最小操作就是区间不同数的一半&#xff0c;因为可以把一个数变成另一个不一样的数&#xff0c;一下抵消两个。 #include<bits/stdc.h> using namespace std; //…

苹果CMS V10萌芽采集插件Pro v10.7.3

苹果CMS V10萌芽采集插件Pro v10.7.3 插件下载:萌芽采集插件Pro v10.7.3.zip 使用说明: 将addons文件和static文件放到你苹果cms程序的根目录并覆盖&#xff0c; 在登录后台在应用-应用市场启用。http://你的域名/admin.php/admin/mycj/union.html

等保测评练习卷19

等级保护初级测评师试题19 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1.为了有效处理等级保护对象运行过程中可能发生的重大安全事件&#xff0c;需要在统一的框架下制定针对不同安全事件的应急预…

FPGA开发——呼吸灯的设计

一、原理 呼吸灯的原理主要基于‌PWM&#xff08;脉冲宽度调制&#xff09;技术&#xff0c;通过控制LED灯的占空比来实现亮度的逐渐变化。这种技术通过调整PWM信号的占空比&#xff0c;即高电平在一个周期内所占的比例&#xff0c;来控制LED灯的亮度。当占空比从0%逐渐变化到1…

java计算机毕设课设—记账管理系统(附源码和安装视频)

这是什么系统&#xff1f; java计算机毕设课设—记账管理系统&#xff08;附源码和安装视频&#xff09; 记账管理系统主要用于财务人员可以从账务中判断公司的发展方向。对个人和家庭而言&#xff0c;通过记账可以制定日后的 消费计划&#xff0c;这样才能为理财划出清晰合理…

C++初学者指南-6.函数对象--lambdas(基础)

C初学者指南-6.函数对象–lambdas(基础) 文章目录 C初学者指南-6.函数对象--lambdas(基础)提醒:函数类和对象Lambdas变量捕获保存闭包通用Lambdas (C14)广义捕获 (C14)相关内容 幻灯片 提醒:函数类和对象 类至少提供一个operator () (…) {…} 函数能像一个函数一样被调用可以…

Nginx制作下载站点

使用nginx制作一个类似nginx官网的下载站点 如何制作一个下载站点,首先需要ngx_http_autoindex_module模块 该模块处理以斜杠(“/”)结尾的请求&#xff0c;并生成目录列表。 nginx编译的时候会自动加载该模块&#xff0c;但是该模块默认是关闭的&#xff0c;需要使用下来指令…

苦学Opencv的第九天:模板匹配

Python OpenCV入门到精通学习日记&#xff1a;模板匹配 前言 模板匹配是一种最原始、最基本的识别方法&#xff0c;可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中&#xff0c;例如&#xff0c;在集体合照中找到某个人的位置。 #mermaid-svg-N…

一个网站的js与cookie,页面缓存清理方案

浏览器在使用过程中会产生大量的缓存&#xff0c;Edge浏览器如何清理缓存&#xff1f;下面是Edge浏览器清理缓存的操作步骤。 页面缓存清理方案 打开开发者模式点击应用程序 按顺序点击即可 js缓存问题分析 修改完 js文件中的代码后&#xff0c;页面刷新好几次并没有重新加载…

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…

Leetcode—263. 丑数【简单】

2024每日刷题&#xff08;147&#xff09; Leetcode—263. 丑数 实现代码 class Solution { public:bool isUgly(int n) {if(n < 0) {return false;}for(const int prime: {2, 3, 5}) {while(n % prime 0) {n / prime;}}return n 1;} };运行结果 之后我会持续更新&#…

区块链在艺术市场中的创新:数字艺术品的溯源与版权保护

随着数字技术的迅猛发展&#xff0c;数字艺术品正逐渐成为艺术市场的重要组成部分。然而&#xff0c;数字艺术品的复制和版权问题日益突出&#xff0c;传统的版权管理方式面临挑战。区块链技术作为一种去中心化的分布式账本技术&#xff0c;为解决这些问题提供了新的可能性。本…

AJAX-XMLHttpRequest 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器&#xff1a;4G2C、2G2C、2G2C 安装教程&#xff1a;Centos7环境安装Hadoop集群 2、安装MySQL&#xff0c;用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

Redis-jenkins

1. 什么是jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2. 为什么使用jenkins 使用 Jenkins之前使用 Jenkins之…

深度解析Linux-C——函数和内存管理

目录 函数指针&#xff1a; 指针函数&#xff1a; 参数为指针的函数&#xff1a; 参数为数组的函数&#xff1a; C语言内存管理 stdlib.h头文件常用函数介绍 1、局部变量 2、全局变量 3、 堆空间变量 4、静态变量 5、常量 函数指针&#xff1a; 指向函数的指针&#…

鸿蒙APP架构及开发入门

1.鸿蒙系统 1.1 什么是鸿蒙 鸿蒙是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、…