归并排序C++代码详解,思路流程+代码注释,带你完全学会归并排序

归并排序

归并排序是一种经典的排序算法,属于分治算法的一种。其核心思想是将一个大问题分解成若干个较小的子问题来解决,然后根据子问题的解构建原问题的解。在排序问题中,归并排序将数组分成两半,分别对这两半进行排序,然后将排序好的两个半部分合并成一个有序的整体。

归并排序的具体步骤如下:
分解:将待排序的数组分成两部分,直到每部分只有一个元素或为空。如果数组只有一个元素或为空,则它自然是有序的。

解决:递归地对每部分进行归并排序。

合并:将排序好的两部分合并成一个有序的整体。
在这里插入图片描述

归并排序的算法流程可以用以下伪代码表示:

function mergeSort(array)if length of array <= 1return arrayelsemiddle = length of array / 2left = mergeSort(first half of array)right = mergeSort(second half of array)return merge(left, right)function merge(left, right)result = empty arraywhile left is not empty and right is not emptyif the first element of left <= the first element of rightadd the first element of left to resultremove the first element from leftelseadd the first element of right to resultremove the first element from rightend whileadd the remaining elements of left to resultadd the remaining elements of right to resultreturn result

算法流程如下:
调用归并排序:调用mergeSort函数,传入数组和索引0(数组起始)和n - 1(数组结束)。

递归分解:mergeSort函数首先计算中间索引middle,然后对数组的左半部分和右半部分分别进行递归调用。

基线条件:当数组的大小小于等于1时,递归结束,因为单个元素或空数组自然是有序的。

合并:在递归调用返回后,mergeSort函数调用merge函数,传入数组和左右两部分的索引。

合并过程
merge函数创建两个临时数组temp1和temp2,分别存储原数组的左右两部分。
使用两个索引i和j分别遍历temp1和temp2,比较元素大小,并将较小的元素放入原数组的相应位置。
当一个临时数组的所有元素都被合并后,将另一个数组的剩余元素拷贝到原数组中。

归并排序是一种稳定的排序算法,因为它可以保持相等元素的原始顺序。不过,由于它需要额外的空间来存储临时数组,因此它的空间复杂度为O(n)。时间复杂度为O(nlogn)。

具体代码如下:

#include <iostream>
#include <vector>using namespace std;// 合并两个有序数组
void merge(vector<int>& arr, int left, int middle, int right) {// 创建两个临时数组用于存储分割后的数组int n1 = middle - left + 1;  // 左边数组的大小int n2 = right - middle;     // 右边数组的大小vector<int> temp1(n1);vector<int> temp2(n2);// 分别将原数组中的元素拷贝到临时数组中for (int i = 0; i < n1; i++) {temp1[i] = arr[left + i];}for (int j = 0; j < n2; j++) {temp2[j] = arr[middle + 1 + j];}// 合并两个临时数组到原数组中int i = 0;  // 左边数组的起始索引int j = 0;  // 右边数组的起始索引int k = left; // 合并后数组的起始索引while (i < n1 && j < n2) {if (temp1[i] <= temp2[j]) {arr[k] = temp1[i];i++;} else {arr[k] = temp2[j];j++;}k++;}// 将剩余的元素拷贝到原数组中while (i < n1) {arr[k] = temp1[i];i++;k++;}while (j < n2) {arr[k] = temp2[j];j++;k++;}
}// 归并排序
void mergeSort(vector<int>& arr, int left, int right) {if (left < right) {int middle = left + (right - left) / 2;// 分割数组并递归调用归并排序mergeSort(arr, left, middle);mergeSort(arr, middle + 1, right);// 合并两个有序数组merge(arr, left, middle, right);}
}int main() {vector<int> arr = {9, 5, 7, 3, 1, 8, 6, 2, 4};int n = arr.size();cout << "原始数组: ";for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;// 调用归并排序算法mergeSort(arr, 0, n - 1);cout << "排序后的数组: ";for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}

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

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

相关文章

车载软件架构 - AP AUTOSAR 设计思想及原理

车载软件架构 - AP AUTOSAR 设计思想及原理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…

物联网实战--平台篇之(十一)设备管理后台

目录 一、设备数据库 二、添加设备 三、排序设备 四、重命名设备 五、删除设备 六、移动设备 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/categ…

港科夜闻 | 香港科大于首尔高峰论坛分享三十载发展里程,并与韩国知名机构学府加强交流...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大于首尔高峰论坛分享三十载发展里程&#xff0c;并与韩国知名机构学府加强交流。香港科大致力加强与韩国机构和产业的联系&#xff0c;大学高层管理人员于5月29-30日出席首尔一个备受瞩目的论坛&#xff0c;并与当…

Codeforces Round 949 (Div. 2 ABCD) 视频讲解

A. Turtle and Piggy Are Playing a Game Problem Statement Turtle and Piggy are playing a number game. First, Turtle will choose an integer x x x, such that l ≤ x ≤ r l \le x \le r l≤x≤r, where l , r l, r l,r are given. It’s also guaranteed that …

OpenAI 的 GPT-4o 是目前最先进的人工智能模型!如何在工作或日常生活中高效利用它?

OpenAI 的 GPT-4o 是目前最先进的人工智能模型&#xff01;如何在工作或日常生活中高效利用它&#xff1f; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大…

RabbitMQ延时队列

一、RabbitMQ下载并使用插件 1、查看RabbitMQ插件的文件路径 docker inspect rabbitmq 找到Mounts下面Name:rabbitmq_plugin的Source即为插件路径 使用 cd 进入到该目录 2、下载插件 wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download…

vue-el-steps 使用1(上一步、下一步)

vue代码 <template> <div class"app-container"> <el-steps :active"active" finish-status"success" simple style"margin-top: 20px"> <el-step title"选择分类"></el-step> <el-step t…

字典树,AcWing 5726. 连续子序列

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 5726. 连续子序列 - AcWing题库 二、解题报告 1、思路分析 字典树存储前缀和 考虑边遍历计算前缀和&#xff0c;边查询字典树 查询流程&#xff1a; 记当前前缀和为s 如果当前位k为1&#xff0c;那么s …

苹果电脑如何清理最近打开的文稿记录 Mac如何移除浏览痕迹保护隐私

日常使用苹果电脑的过程中&#xff0c;我们经常会打开各种文稿&#xff0c;浏览网页等操作。然而&#xff0c;这些操作可能会留下一些记录&#xff0c;涉及到个人隐私和数据安全问题。下面我们来看看苹果电脑如何清理最近打开的文稿记录&#xff0c;Mac如何移除浏览痕迹保护隐私…

C++进阶篇章:set与map(pair , multiset , multimap)

目录 1.关联式容器与序列式容器 2.pair&#xff08;键值对&#xff09; 3.set 构造函数 find函数 count函数&#xff1a; insert函数 4.multiset 5.map insert函数 operator[] 1.关联式容器与序列式容器 C中关联式容器与序列式容器是两种不同的容器 1.关联式容器 关…

力扣--双指针15.三数之和

详细思路 排序数组&#xff1a;首先对数组 nums 进行排序&#xff0c;目的是为了方便后续使用双指针查找和避免重复结果。遍历数组&#xff1a;使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素&#xff1a;如果当前元素 nums[i] 与前一个元素…

SpringBoot项目实现自定义注解方式的接口限流

一&#xff0c;实现原理 该限流方式使用的是令牌桶算法&#xff0c;令牌桶算法是基于漏桶算法的一种改进&#xff0c;主要在于令牌桶算法能够在限制服务调用的平均速率的同时&#xff0c;还能够允许一定程度内的突发调用。 系统以固定的速率向桶中添加令牌当有请求到来时&#…

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生&#xff0c;就是努力工作&#xff0c;买房&#xff0c;买车&#xff0c;送孩子上好的学校&#xff0c;为了孩子不要输在起跑线上&#xff0c;拼命报各种补习班等&#xff0c;这些都是普通人认为的主流价值观文化&#xff0c;也造就了一批批的赚钱机器&#xf…

带DSP音效处理D类数字功放TAS5805M中文资料

国产替代D类数字功放中文资料访问下方链接 ACM8628 241W立体声182W单通道数字功放中文寄存器表 内置DSP多种音频处理效果ACM8628M-241W立体声或182W单通道数字功放 1 特性 具有增强处理能力和低功率损耗的 TAS5805M 23W、无电感器、数字输入、立体声、闭环 D 类音频放大器 …

华为设备配置静态路由和默认路由

华为设备配置静态路由和默认路由 理论部分知识&#xff1a; 路由分为两个大类&#xff1a;静态路由-----动态路由 静态路由&#xff1a;手工指定&#xff0c;适用于小规模的网络应用场景&#xff0c;如果网络规模变大&#xff0c;这样的方式非常不适合而且容易出错。 语法&…

Java之IO流

一、引言 &#xff08;1&#xff09;解释&#xff1a; i&#xff1a;input &#xff08;输入&#xff09; o&#xff1a;output &#xff08;输出&#xff09; &#xff08;2&#xff09;图解 注意&#xff1a; 1、Xxx 这个程序一旦在桌面关闭掉了&#xff0c;也就是运行完…

动态路由OSPF单区域和多区域配置实验

动态路由OSPF的配置 OSPF分类两种情况&#xff1a;单区域 多区域路由 OSPF单区域路由配置 OSPF&#xff1a;开放最短路径优先的路由协议。属于大型动态路由协议&#xff0c;适用于中大型的园区网。 网络拓扑&#xff1a; 配置步骤&#xff1a; 1.完成基本配置&#xff08;略&…

能耗监测系统在上海交通大学闵行校区理科实验楼群的设计与应用

引言 建筑能耗系统&#xff0c;除了基本的电力参数监测、配电系统的运行状况&#xff0c;更加关注能耗的去向。除了常规的园区楼层出线电能计量&#xff0c;还会涉及水&#xff0c;气等能耗计量。 针对上海交通大学闵行校区理科实验楼群能耗监测系统的具体要求&#xff0c;以…

依赖管理包介绍

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 相关组件 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get进行依赖管理"相关的内容&#xff0c;本章回中将介绍如何使用get进行状态管理一.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 …