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

归并排序

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

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

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

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

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

function mergeSort(array)
    if length of array <= 1
        return array
    else
        middle = length of array / 2
        left = mergeSort(first half of array)
        right = mergeSort(second half of array)
        return merge(left, right)

function merge(left, right)
    result = empty array
    while left is not empty and right is not empty
        if the first element of left <= the first element of right
            add the first element of left to result
            remove the first element from left
        else
            add the first element of right to result
            remove the first element from right
    end while
    add the remaining elements of left to result
    add the remaining elements of right to result
    return 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0基础认识C语言(理论+实操3)

所有籍籍无名的日子里 我从未看轻自己半分 小伙伴们&#xff0c;一起开始我们今天的话题吧 一、算法操作符 1.双目操作符 为何叫双目操作符呢&#xff1f;其实是因为我们进行加减乘除的时候&#xff0c;至少得需要两个数字进行这些运算&#xff0c;而这个数字就被称为操作数…

Java对sqlserver表的image字段图片读取和输出本地

Java代码实现对sqlserver数据库表的image字段图片的读取&#xff0c;和输出存储到本地 由于表image字段图片存的内容是二进制值&#xff0c;如何输出保存到本地&#xff1a; 代码示例&#xff1a;&#xff08;注&#xff1a;连接sqlserver数据库需配置其驱动文件&#xff09; …

基础—SQL—DCL(数据控制语言)之用户管理

一、引言 分类全称描述DCLData Control Language&#xff08;数据控制语言&#xff09;用来创建和管理数据库用户以及控制数据库的访问权限 1、图解 右边的是我们的 MySQL 的数据库服务器&#xff0c;左边是假设的两个用户 1、 DCL 主要控制的就是有哪些用户可以来访问这台 My…

英语翻译程序,可以对用户自己建立的词汇表进行增删查改

⑴ 自行建立一个包含若干英文单词的词汇表文件&#xff0c;系统初始化时导入内存&#xff0c;用于进行句子翻译。 ⑵ 用户可以输入单词或者句子&#xff0c;在屏幕上显示对应翻译结果。 ⑶ 用户可对词汇表进行添加和删除&#xff0c;并能将更新的词汇表存储到文件中。 #defi…

RDD实战:排序算子 - sortBy()

在本实战案例中&#xff0c;我们将使用Apache Spark的sortBy()算子来对一个包含学生信息的RDD进行排序操作。 排序规则如下&#xff1a; 首先按照性别升序排列。在性别相同的情况下&#xff0c;按照年龄降序排列。 步骤1&#xff1a;创建学生信息列表 首先&#xff0c;我们创…

《计算机工程与应用》最新投稿经验2024年5月

研二下第一次投稿&#xff0c;深度学习长时间序列预测方向&#xff0c;选择了《计算机工程与应用》期刊&#xff0c;是CSCD扩展刊北大核心&#xff0c;且在24年被EI收录等等。4.10交稿到最后5.31收到录用通知&#xff0c;历时不到2个月&#xff0c;总的来说编辑部效率确实高。 …

基于强化学习的控制率参数自主寻优

1.介绍 针对控制建模与设计场景中控制参数难以确定的普遍问题&#xff0c;提出了一种基于强化学习的控制律参数自主优化解决方案。该方案以客户设计的控制律模型为基础&#xff0c;根据自定义的控制性能指标&#xff0c;自主搜索并确定最优的、可状态依赖的控制参数组合。 可…

中建环能 | “农村生活污水治理稳质增效与智能运维技术研究及成套装备应用” 科技成果评价

中华环保联合会组织召开了中建环能科技股份有限公司申请的“农村生活污水治理稳质增效与智能运维技术研究及成套装备应用”技术成果评价会。会议由中华环保联合会水环境治理专业委员会秘书长刘愿军主持。 评审会委员 本次评价会邀请了7位相关专业领域的专家组成专家评价委员会。…

spoon工具的安装与配置

spoon对应的jdk包下载资源地址 spoon软件下载资源地址 首先需要安装jdk&#xff0c;配置java环境&#xff0c;安装好后&#xff0c;cmd一下&#xff0c;查看java -version&#xff0c;看看是否成功安装&#xff0c;如果失败&#xff0c;查看系统环境变量&#xff0c;去配置jdk…

Vue3-Vite-ts 前端生成拓扑图,复制即用

完整代码&#xff0c;复制即可用&#xff0c;样式自调 试过 jointjs dagre-d3 vis&#xff0c;好用一点 方法1&#xff1a;Vis.js npm install vis-network <template><div id"mynetwork" class"myChart" :style"{width: 100%, height: 9…

QGraphicsView实现简易地图19『迁徙图』

模仿echarts的迁徙图效果 用到了前2篇制作的散点(涟漪效果)和两年前的路径动画类&#xff1b;然尾迹效果未依附路径&#xff0c;有待优化。 动态演示效果 静态展示图片 核心代码 #pragma once #include "Item/AbstractGeoItem.h" #include "DataStruct/GeoD…

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

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

JavaSE:异常

1、什么是异常 在生活当中&#xff0c;不管是人还是动物又或是植物&#xff0c;都会生病&#xff1b;在程序中也是&#xff0c;作为程序猿&#xff0c;虽然我们会尽力将程序写的完美&#xff0c;可难免会出现一些问题~ 在程序执行过程中&#xff0c;发生的一些不正常行为&…

2024年5月31日 (周五) 叶子游戏新闻

《Granblue Fantasy: Relink》版本更新 新增可操控角色及功能世嘉股份有限公司现已公开《Granblue Fantasy: Relink》&#xff08;以下简称 Relink&#xff09;免费版本更新ver.1.3.1于5月31日&#xff08;周五&#xff09;上线的消息。该作是由Cygames Inc.&#xff08;下称Cy…

进程——linux

目录 冯诺依曼体系结构&#xff08;计算机组成原理与体系结构&#xff09; 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…

一维时间序列信号的小波模极大值分解与重建(matlab R2018A)

数学上称无限次可导函数是光滑的或没有奇异性&#xff0c;若函数在某处有间断或某阶导数不连续&#xff0c;则称函数在此处有奇异性&#xff0c;该点就是奇异点。奇异性反映了信号的不规则程度&#xff0c;因为信号的奇异点和突变部分往往携带者重要信息&#xff0c;因此信号的…

资深人士称:AI开发游戏会降低游戏成本和体验,不会降低就业率

易采游戏网6月1日最新消息&#xff1a;本周在TD Cowen会议上&#xff0c;R星的母公司Take-Two的CEO Strauss Zelnick对于人工智能(AI)是否会影响游戏开发行业表达了自己的看法。他坚定地认为&#xff0c;AI绝对会改变游戏的制作方式&#xff0c;但不会降低游戏行业的就业水平。…

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

YOLOv8 segment介绍

1.YOLOv8图像分割支持的数据格式&#xff1a; (1).用于训练YOLOv8分割模型的数据集标签格式如下: 1).每幅图像对应一个文本文件&#xff1a;数据集中的每幅图像都有一个与图像文件同名的对应文本文件&#xff0c;扩展名为".txt"; 2).文本文件中每个目标(object)占一行…

OCR图片转Excel表格:没结构化的弊端

随着OCR技术的不断发展&#xff0c;将表格图片转为excel已不再是难题&#xff0c;但是&#xff0c;目前市面上的程序还大多处于仅能将图片表格转为普通的excel格式阶段&#xff0c;而不能将其结构化&#xff0c;这样就会产生许多的弊端&#xff0c;具体弊端如下&#xff1a; &l…