归并排序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;任何消…

Nginx下载大文件超时配置和请求超时配置等

Nginx下载大文件超时配置和请求超时配置等 location /download {......proxy_buffering off;proxy_connect_timeout 180s;proxy_send_timeout 180s;proxy_read_timeout 180s;proxy_send_timeout 10s;...... }1.proxy_buffering off; 这个指令用于关闭或开启代理响应的缓冲。当…

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

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

MoE大模型

MoE&#xff08;Mixture of Experts&#xff09;架构在人工智能领域具有以下优势&#xff1a; 1. **表现力强大**&#xff1a;MoE通过融合多个专家模型&#xff0c;能够更好地适应不同输入样本的特点&#xff0c;提高模型的表达能力&#xff0c;从而在处理复杂任务时表现出更高…

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

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 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…

React Native 之 react-native-share(分享)库 (二十三)

react-native-share 是一个流行的 React Native库&#xff0c;它允许你在移动应用中分享文本、链接、图片等内容到各种社交网络和消息应用。以下是对其原理的简要概述以及代码示例的解析。 代码示例解析 1. 安装 npm install react-native-share # 或者 yarn add react-n…

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…

6月01日,每日信息差

第一、东航 C919 国产大飞机成功执飞首个跨境商业包机&#xff0c;从上海虹桥机场飞往香港特区&#xff0c;主要目的是为了运送参加 「沪港同心 相聚上海」 实习计划的香港青年学生。当天的返程包机预计在下午从香港起飞&#xff0c;回到虹桥机场&#xff0c;届时将有一场欢迎仪…

字典树,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.关联式容器 关…

GAMIT目录配置

1打开home&#xff0c;显示隐藏文件&#xff0c;CTRH 2修改目录 #set gamitpath gamitpath/opt/gamit10.7 export PATH$PATH:${gamitpath}/com/:${gamitpath}/gamit/bin:${gamitpath}/kf/bin HELP_DIR${gamitpath}/help export HELP_DIR #set GMT path gmtpath/usr/lib/gmt P…

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

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

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

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

软设之快速排序

快速排序是冒泡排序的改进算法 它采用的是分治法&#xff0c;基本思想是把原问题分解为若干规模更小但结构与原问题相似的子问题&#xff0c;通过递归解决这些子问题&#xff0c;然后将这些子问题的解组合成原问题的解。 它的步骤是 1.在待排序的n个记录中任取一个记录&…

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

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