排序算法---归并排序

原创不易,转载请注明出处。欢迎点赞收藏~

归并排序是一种常见的排序算法,它采用了分治的思想。它将一个待排序的数组递归地分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序数组。

具体的归并排序过程如下:

  1. 将待排序的数组不断地二分,直到每个子数组只剩下一个元素。
  2. 对每个子数组进行合并操作,即将两个有序的子数组合并成一个有序数组。合并操作是通过比较两个子数组的首元素,选取较小的元素放入临时数组中,然后移动相应的指针,重复此过程直到其中一个子数组为空,再将另一个子数组中的剩余部分直接放入临时数组中。
  3. 重复步骤2,直到所有的子数组都被合并成一个有序数组。

归并排序的时间复杂度为 O(nlogn),其中 n 表示待排序数组的长度。这是因为在每一层递归中,需要将所有的子数组都进行合并,而合并两个长度为 n 的有序数组的时间复杂度为 O(n)。总共需要进行 logn 层的递归,因此时间复杂度为 O(nlogn)。

归并排序的空间复杂度为 O(n),主要是由于合并过程中需要使用一个临时数组来存储排序结果。

归并排序是一种稳定的排序算法,适用于各种规模的数据集。但由于它需要额外的空间来存储临时数组,所以在处理大规模数据时,可能会占用较多的内存。

以下是一个基于C语言的归并排序示例:

#include <stdio.h>// 合并两个有序数组
void merge(int arr[], int left[], int leftSize, int right[], int rightSize)
{int i = 0, j = 0, k = 0;// 比较两个子数组的元素,将较小的元素放入原始数组arr中while (i < leftSize && j < rightSize){if (left[i] <= right[j]){arr[k++] = left[i++];}else{arr[k++] = right[j++];}}// 将剩余部分的元素放入arr中while (i < leftSize){arr[k++] = left[i++];}while (j < rightSize){arr[k++] = right[j++];}
}// 归并排序
void merge_sort(int arr[], int size)
{// 递归终止条件:当数组只有一个元素时,无需继续划分if (size <= 1){return;}int mid = size / 2;int left[mid];int right[size - mid];// 将数组划分为两个子数组for (int i = 0; i < mid; i++){left[i] = arr[i];}for (int i = mid; i < size; i++){right[i - mid] = arr[i];}// 对两个子数组分别进行归并排序merge_sort(left, mid);merge_sort(right, size - mid);// 合并两个有序子数组merge(arr, left, mid, right, size - mid);
}int main()
{int arr[] = {7, 2, 4, 1, 5, 3};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组:\n");for (int i = 0; i < size; i++){printf("%d ", arr[i]);}merge_sort(arr, size);printf("\n排序后的数组:\n");for (int i = 0; i < size; i++){printf("%d ", arr[i]);}putchar('\n');return 0;
}

这段代码实现了归并排序算法。归并排序是一种基于分治思想的排序算法,它将待排序的数组分成两个子数组,分别进行排序,然后合并两个有序的子数组,从而得到完整的有序数组。

代码中的merge()函数用于合并两个有序数组。它通过比较两个子数组的元素,将较小的元素依次放入原始数组arr中。最后,将剩余部分的元素放入原始数组中,以确保所有元素都被归并到正确的位置。

merge_sort()函数是归并排序的核心部分。它首先递归地将数组划分为两个子数组,然后对这两个子数组分别调用merge_sort()函数进行排序。最后,调用merge()函数将两个有序的子数组合并为一个有序数组。

在main()函数中,我们声明了一个整型数组arr并初始化了一些元素。然后,我们调用merge_sort()函数对数组进行归并排序,并打印原始数组和排序后的数组。

最终输出的结果是原始数组和排序后的数组。你可以根据需要修改输入的数组和数组长度,来验证归并排序的效果。

运行如上代码,你可以看到以下输出:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风行智能电视N39S、N40 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin

升级步骤&#xff1a; 1、下载刷机数据&#xff0c;如是压缩包&#xff0c;需要先解压&#xff0c;然后将刷机bin格式的文件重命名为MstarUpgrade.bin 2、将此文件放到U盘根目录 &#xff08;U盘格式FAT32&#xff0c;单分区&#xff0c;建议4G的优盘刷机成功率高&#xff09;…

【java】Log4j漏洞本地复现,远程执行脚本

在log4j 2.14.0之前的版本存在此漏洞。 首先导入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version> </dependency> <dependency><groupI…

Spring第二天

一、第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1 管理DataSource连接池对象 问题导入 配置数据库连接参数时&#xff0c;注入驱动类名是用driverClassName还是driver&#xff1f; 1.1 管理Druid连接池【重点】 数据库准备…

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类&#xff0c;它实现了 SortedMap 接口。它是…

C语言常见面试题:什么是变量?变量有哪些作用?

变量是编程中的一个基本概念&#xff0c;其定义和用法因编程语言和上下文而异。但通常来说&#xff0c;变量是用于存储数据的容器&#xff0c;这些数据可以是数字、文本、布尔值等。以下是变量的一些主要作用和特点&#xff1a; 存储数据&#xff1a;变量的主要作用是存储数据…

汇编的两道题

1.编写一个在显示器上显示一个笑脸字符的程序 看这段程序的结构&#xff0c;可以看出&#xff0c;每个代码段&#xff0c;带有segment的必须用ASSUME 来进行段分配。 PROG1 SEGMENT;PROG1段的开始ASSUME CS:PROG1;PROG1&#xff08;自己命名的&#xff0c;叫啥都可以&#xff…

Rust语言入门小结(第1篇)

Rust是一种新兴编程语言&#xff0c;既有高级语言的风格&#xff0c;又有底层语言级别的性能&#xff1b;是对于实时性、安全性要求高的应用开发的理想语言。 笔者的自学记录&#xff0c;供参考 环境搭建与第一个Rust程序 以Linux环境为例 # 下载并安装 curl --proto https -…

深入理解Netty及核心组件使用—上

目录 Netty的优势 为什么Netty使用NIO而不是AIO&#xff1f; Netty基本组件 Bootstrap、EventLoop(Group) 、Channel 事件和 ChannelHandler、ChannelPipeline ChannelFuture Netty入门程序 服务端代码 客户端代码 运行结果 Netty的优势 1. API 使用简单&#xff0c…

docker部署showdoc

目录 安装 1.拉取镜像 2.创建容器 使用 1.选择语言 2.默认账户/密码:showdoc/123456​编辑 3.登陆 4.首页 安装 1.拉取镜像 docker pull star7th/showdoc 2.创建容器 mkdir -p /opt/showdoc/html docker run -d --name showdoc --userroot --privilegedtrue -p 1005…

RocketMQ事务消息

事务消息 应用场景&#xff1a; ​ 事务消息是RocketMQ非常有特色的一个高级功能。他的基础诉求是通过RocketMQ的事务机制&#xff0c;来保证上下游的数据一致性。 ​ 以电商为例&#xff0c;用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购…

黄金交易策略:手工同向单减保留仓

虽然保留仓的仓位不大&#xff0c;扛个一年半载不是问题&#xff0c;但闲着也可以手工处理掉&#xff08;10000点以内的不要处理&#xff09;。挑一个最大的单&#xff0c;同向相同的手数&#xff0c;并把两单的止盈设置中位数&#xff08;也没有这么严格&#xff0c;差不多就好…

[嵌入式AI从0开始到入土]5_炼丹炉的搭建(基于wsl2_Ubuntu22.04)

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

深度学习在知识图谱问答中的革新与挑战

目录 前言1 背景知识2 基于深度学习改进问句解析模型2.1 谓词匹配2.2 问句解析2.3 逐步生成查询图 3 基于深度学习的端到端模型3.1 端到端框架3.2 简单嵌入技术 4 优势4.1 深入的问题表示4.2 实体关系表示深挖4.3 候选答案排序效果好 5 挑战5.1 依赖大量训练语料5.2 推理类问句…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址&#xff1a;https://developer.android.com/studio/archive androi…

vue使用Mars3d弹框嵌套video视频/实时视频(m3u8)使用hls.js

下载hls.js http://mars3d.cn/lib/video/hls/hls.js下载 1.首先绘制地图我使用的天地图 async infoMars3d() {const that this;var mapOptions {scene: {center: {lat: 30.435192,lng: 103.936535,alt: 200000,heading: 359,pitch: -79},highDynamicRange: false},// 方式1&a…

bat 不通服务器之间文件夹文件增量同步

要在不同的服务器之间实现文件夹的增量同步&#xff0c;你可以使用批处理脚本结合一些外部工具&#xff0c;比如Robocopy&#xff0c;这是一个Windows内置的命令行工具&#xff0c;专门用于文件和目录的复制&#xff0c;并支持增量复制。 以下是一个使用Robocopy的批处理脚本示…

Backtrader 文档学习- Plotting

Backtrader 文档学习- Plotting 虽然回测是一个基于数学计算的自动化过程&#xff0c;还是希望实际通过可视化验证。无论是使用现有算法回测&#xff0c;还是观察数据驱动的指标&#xff08;内置或自定义&#xff09;。 凡事都要有人完成&#xff0c;绘制数据加载、指标、操作…

Redis实现秒杀

前期准备 缓存选择考虑 Redis和Redis Cluster&#xff08;分布式版本&#xff09;&#xff0c;是一个分布式缓存系统。其支持多种数据结构&#xff0c;也支持MQ。Redis在性能上做了大量优化。因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。 用Redis的这…

图数据库 之 Neo4j - Browser 介绍(3)

Neo4j Browser 介绍 Neo4j Browser 中有 3 个模块&#xff0c;侧边栏&#xff0c;Cypher 编辑器与结果栏&#xff0c;在进入 Neo4j Browser 时结果栏会展示欢迎界面。 Cypher 编辑器 Cypher 是一种图形查询语言&#xff0c;用于查询和操作图形数据库。它是 Neo4j 图形数据库的…

积加ERP:实现电商平台、CRM和客服系统的高效集成

无缝连接&#xff1a;积加ERP与多元电商平台的集成 积加ERP利用其突破性的无代码开发技术&#xff0c;与亚马逊、沃尔玛等电商巨头实现了无缝连接。这种深度集成的方式&#xff0c;降低了跨境卖家的工作压力&#xff0c;提升了运营智能化水平&#xff0c;使得供应链管理和财务…