每日算法——归并排序

什么是归并排序

归并排序是一种分治算法。它将数组不断地分成两半,对每一半进行排序,然后再将排序好的两半合并起来。通过不断重复这个过程,最终得到完全排序的数组。

归并排序的注意点

  • 空间复杂度:归并排序需要额外的与原始数组大小相同的临时空间来进行合并操作,这可能在一些内存受限的场景下需要特别注意。
  • 递归深度:在处理大规模数据时,可能会导致较深的递归调用,需要关注栈空间的使用情况,避免栈溢出。
  • 边界条件处理:在分割和合并过程中,要确保正确处理各种边界情况,如空数组、只有一个元素的数组等。
  • 性能优化:虽然归并排序性能较为稳定,但在实际应用中可以考虑根据具体情况进行一些优化,比如更高效的合并操作等。

归并排序

题目描述

运行代码

#include <iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N], t[N];
void merge_sort(int q[], int l, int r)
{if (l >= r) return;int mid = l + r >> 1;merge_sort(q, l, mid);merge_sort(q, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) t[k++] = q[i++];else t[k++] = q[j++];while (i <= mid) t[k++] = q[i++];while (j <= r)t[k++] = q[j++];for (i = l, j = 0; i <= r; i++, j++) q[i] = t[j];
}
int main()
{int n;cin>>n;for (int i = 0; i < n; i++) cin>>a[i];merge_sort(a, 0, n - 1);for (int i = 0; i < n; i++) cout<<a[i]<<" ";return 0;
}

代码思路

  1. 定义常量N = 1e5 + 5 用于确定数组的最大长度,以适应最多10万级别的数据。

  2. 归并排序函数merge_sort

    • 输入参数为待排序数组q,以及排序区间的左右边界索引lr
    • l >= r时,说明区间内元素个数小于或等于1,无需排序,直接返回。
    • 计算中间点mid,递归地对左半区间[l, mid]和右半区间[mid+1, r]进行排序。
    • 使用临时数组t[]进行合并操作:设立两个指针ij分别指向左右子序列的起始位置,比较两个序列中的元素,将较小的元素放入t[]中,直至一个序列遍历完。接着,将剩余未遍历完的序列的剩余元素全部拷贝到t[]中。
    • 最后,将t[]中的元素拷贝回原数组q[]中。
  3. 主函数:读取数组长度n和每个元素的值。调用merge_sort函数对数组进行排序。输出排序后的数组。

优化建议

  1. 减少临时数组的频繁创建:在当前代码中,每次递归调用merge_sort时都会创建和销毁临时数组t[],这在大数组排序时会消耗大量时间和空间。可以在函数外部定义一个全局的临时数组,避免每次递归都创建新数组。

  2. 非递归实现:对于极深的递归调用可能导致栈溢出的问题,可以考虑使用迭代而非递归的方式来实现归并排序,通过栈来管理待合并的区间,减少递归调用的深度。

  3. 尾递归优化:虽然C++标准没有强制规定编译器必须进行尾递归优化,但在理论上,如果编译器支持,可以通过修改递归调用的方式(在函数末尾调用自身,并且不需要在调用之后做其他操作)来实现。不过,归并排序的自然逻辑不太容易直接应用尾递归。

  4. 并行化:对于非常大的数据集,可以考虑将数组分割成多个部分,使用多线程或多进程分别排序,最后合并结果。这要求对归并过程进行适当的同步控制,以确保正确性。

其他代码(分治)

#include<iostream>
using namespace std;
const int N=1e5+5;
int a[N],temp[N];
void sortt(int a[],int l,int r){if (l >= r) { // 添加边界检查return;}int mid = (l + r) >> 1;sortt(a, l, mid);sortt(a, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r) {if (a[i] <= a[j]) {temp[k++] = a[i++];} else {temp[k++] = a[j++];}}while (i <= mid) {temp[k++] = a[i++];}while (j <= r) {temp[k++] = a[j++];}for (i = l, j = 0; i <= r; i++, j++) {a[i] = temp[j];}return;
}
int main() {int n;if (cin >> n) { // 检查输入是否成功for (int i = 0; i < n; i++) {cin >> a[i];}sortt(a, 0, n - 1);for (int i = 0; i < n; i++) {cout << a[i] <<'';}} return 0;
}

代码思路

整体流程

  • 定义了一个常量 N 表示数组可能的最大长度。
  • 在 sortt 函数中实现归并排序的核心逻辑。
  • 在 main 函数中获取输入的数组长度 n ,并读取数组元素,然后调用 sortt 函数进行排序,最后输出排序后的结果。

归并排序的具体思路

  • sortt 函数通过不断地将数组区间一分为二,对分割后的两部分分别递归调用自身进行排序。
  • 在合并阶段,通过两个指针 i 和 j 分别遍历左右已排序的两部分。比较两个指针所指向元素的大小,将较小的元素放入临时数组 temp 中,并相应地移动指针。
  • 当左右两部分中的某一部分遍历完后,将另一部分剩余元素直接添加到临时数组后面。
  • 最后将临时数组中的排序好的元素复制回原数组对应的位置。

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

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

相关文章

MQ解决的问题

系统中MQ能解决哪些问题&#xff1f; 1.不同语言的程序使用MQ通信 2.分布式&#xff0c;微服务&#xff0c;之间的通信&#xff0c;实现服务质检解耦 3.高并发实现销峰作用 4.实现异步&#xff0c;提高用户体验。

Mysql使用中的性能优化——搭建Mysql的监测服务

大纲 环境安装配置Mysql安装设置root密码新增远程访问账户修改绑定地址重启 新增 MySQL Server Exporter 用户 安装启动mysqld_exporter安装启动新增配置启动直接启动以Service形式启动 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料…

[数据集][图像分类]黑色素瘤分类数据集10015张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;10015 分类类别数&#xff1a;7 类别名称:[“0”,“1”,“2”,“3”,“4”,…

【博士每天一篇文献-综述】Modularity in Deep Learning A Survey

阅读时间&#xff1a;2023-12-8 1 介绍 年份&#xff1a;2023 作者&#xff1a;孙浩哲&#xff0c;布朗克斯医疗卫生系统 会议&#xff1a; Science and Information Conference 引用量&#xff1a;4 论文主要探讨了深度学习中的模块化&#xff08;modularity&#xff09;概念…

软件测试--Mysql快速入门

文章目录 软件测试-mysql快速入门sql主要划分mysql常用的数据类型sql基本操作常用字段的约束&#xff1a;连接查询mysql内置函数存储过程视图事务索引 软件测试-mysql快速入门 sql主要划分 sql语言主要分为&#xff1a; DQL&#xff1a;数据查询语言&#xff0c;用于对数据进…

传感器展会|2024厦门传感器与应用技术展览会

传感器展会|2024厦门传感器与应用技术展览会 时间&#xff1a;2024年11月1-3日 地点&#xff1a;厦门国际会展中心 XISE EXPO展会介绍&#xff1a; 2024中国&#xff08;厦门&#xff09;国际传感器与应用技术展览会将于2024年11月1-3日在厦门国际会展中心举行&#xf…

2024浙江省三支一扶报名流程!超详细图解!

2024浙江省三支一扶报名流程&#xff01;超详细图解&#xff01; 浙江省高校毕业生“三支一扶”报名即将开始&#xff0c;准备报考的同学们做好准备&#xff1a; &#x1f534;重点时间安排&#xff1a; 1、网络报名&#xff1a;6月11日9:00至6月18日17:00 2、资格审核&…

Selenium with Python Behave(BDD)

一、简介 Python语言的行为驱动开发&#xff0c;Behavior-driven development&#xff0c;简称BDD. "Behavior-driven development (or BDD) is an agile software development technique that encourages collaboration between developers, QA and non-technical or bu…

5 个你不知道的隐藏 CSS 属性

层叠样式表 (CSS) 是网页设计的骨架&#xff0c;它可以帮助我们轻松的设置网页的样式和格式。虽然大多数的 CSS 属性&#xff0c;例如颜色、字体大小和边距都被大家熟知&#xff0c;但还有许多鲜为人知的属性可以帮助我们设计添加功能。在这篇文章中&#xff0c;我们将介绍 5 个…

英语国际音标 - DJ 音标 - KK 音标

英语国际音标 - DJ 音标 - KK 音标 1. 国际音标 (International Phonetic Alphabet&#xff0c;IPA)1.1. 记音类型1.2. 48 个国际音标发音表1.2.1. 元音 (vowel)1.2.1.1. 单元音 (monophthong)1.2.1.2. 双元音 (diphthong) 1.2.2. 辅音 (consonant)1.2.2.1. 清音 (voiceless so…

深入探讨跨域请求(CORS):原理、解决方案与详细示例代码

深入探讨跨域请求&#xff08;CORS&#xff09;&#xff1a;原理、解决方案与详细示例代码 &#x1f310; 深入探讨跨域请求&#xff08;CORS&#xff09;&#xff1a;原理、解决方案与详细示例代码 &#x1f310;摘要引言正文内容什么是跨域&#xff1f;为什么会有跨域问题&am…

Word表格里的文字如何上下、水平都居中

全选表格 表格工具——布局 在对齐方式那里

Adobe Premiere Pro 2024下载安装(视频剪辑软件Pr2024)

百度网盘下载地址&#xff08;含PR教学课程&#xff08;PR从入门到精通108节课程&#xff09;&#xff09;https://pan.baidu.com/s/1WKYZENoMzTcKhbgMgbEPGQ?pwdSIMS 一、Pr简介 Pr全称Premiere&#xff0c;是Adobe公司开发的一款功能强大的视频剪辑软件&#xff0c;目前被…

LLVM 后端执行流程

异构计算程序工作流程 图4-1中的LLVM后端的主要功能是代码生成&#xff0c;其中包括若干指令生成分析转换pass&#xff0c;将LLVM IR 转换为特定目标架构的机器代码 LLVM 流水线结构 输入指令经过图4-2中的各个阶段&#xff0c;从最初的LLVM IR&#xff0c;逐步演化为Selectio…

【Python】使用pip安装seaborn sns及失败解决方法与sns.load_dataset(“tips“)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

《python程序语言设计》2018版第5章第35题求完全数,解题经历,我认为的正确代码放在最后

5.35从4月开始一直到成功&#xff0c;此文章将所有的记录和不同阶段代码展现给大家。但是没有配图&#xff0c;我最后成功的代码放在了最后。 2024.04.15 05.35.01version 求完整数&#xff0c;这个让我突然有点蒙。我什么时候能求完整数呢&#xff1f;&#xff1f; 正因子之和…

网络分析(ArcPy)

一.前言 GIS中的网络分析最重要的便是纠正拓扑关系&#xff0c;建立矫正好的网络数据集&#xff0c;再进行网络分析&#xff0c;一般大家都是鼠标在arcgis上点点点&#xff0c;今天说一下Arcpy来解决的方案&#xff0c;对python的要求并不高,具体api参数查询arcgis帮助文档即可…

JavaScript 使用优先级队列的霍夫曼编码(Huffman Coding using Priority Queue)

先决条件&#xff1a; 贪婪算法 | (霍夫曼编码)、priority_queue::push() 和 C STL 中的 priority_queue::pop() 。 贪婪算法 | (霍夫曼编码)&#xff1a; C#&#xff1a;C# 霍夫曼编码 | 贪婪算法&#xff08;Huffman Coding | Greedy Algo&#xff09;-CSDN博客 JavaScr…

Java数组的定义 ,基本概念与使用

数组的定义 1.问题:想将一个数据保存起来,我们可以使用变量,但是变量一次只能存储一个数据,所以我们想能不能一次存多个数据2.数组概述:是一个容器,数组本身属于引用数据类型3.作用:一次存储多个数据4.特点:a.既可以存储基本类型的数据,还能存储引用类型的数据b.定长(定义数组…

【Android面试八股文】一图展示 Android生命周期:从Activity到Fragment,以及完整的Android Fragment生命周期

图片来源于&#xff1a;https://github.com/xxv/android-lifecycle Android生命周期&#xff1a;从Activity到Fragment 图&#xff1a;android-lifecycle-activity-to-fragments.png 完整的Android Fragment生命周期 图&#xff1a;complete_android_fragment_lifecycle.png…