归并排序之C++实现

news2025/2/4 20:47:46

描述

归并排序是一种经典的排序算法,采用分治的思想。
归并排序是一种基于分治思想的经典排序算法。它将待排序的数组不断地分成两个子数组,直到每个子数组只有一个元素。然后,对每个子数组进行归并排序,即不断地将两个有序的子数组合并成一个有序的数组。最终,所有子数组都合并成一个有序的数组,完成排序。

归并排序的核心操作是合并两个有序数组。合并时,从两个数组的开头依次比较元素的大小,将较小的元素放入结果数组中,直到其中一个数组的元素全部放入结果数组中。然后,将剩余的元素直接放入结果数组中,得到一个有序的合并数组。

归并排序是一种稳定的排序算法,即相等元素的相对位置在排序前后保持一致。它适用于对大规模数据进行排序,但由于递归操作和额外的空间消耗,对于小规模数据可能会有一定的性能损失。在实际应用中,可以根据数据规模和性能需求选择合适的排序算法。

实现思路

  1. 将待排序的数组不断地分成两个子数组,直到每个子数组只有一个元素。
  2. 对每个子数组进行归并排序,即不断地将两个有序的子数组合并成一个有序的数组。
  3. 重复上述步骤,直到所有子数组都合并成一个有序的数组。

图解

image.png

事件复杂度

归并排序的时间复杂度为O(nlogn),其中n表示待排序数组的长度。它的分治思想保证了每次都将待排序数组二分,所以排序的时间复杂度是稳定的。

空间复杂度

归并排序的空间复杂度为O(n),其中n表示待排序数组的长度。在归并排序的过程中,需要创建一个与原数组长度相同的临时数组来存放排序结果。

在归并排序的合并阶段,需要将两个子数组按照顺序合并到临时数组中。这个临时数组的长度与原数组长度相同,因为最差情况下,两个子数组的元素都要合并到临时数组中。

在递归过程中,每次将原数组分成两个子数组,然后对子数组进行排序。这样,递归的深度为logn,每层递归需要O(n)的额外空间来存放临时数组。

综上所述,归并排序的空间复杂度为O(n)。

示例

#include <iostream>
using namespace std;

// 合并两个有序数组
void merge(int arr[], int low, int mid, int high) {
    int n1 = mid - low + 1; // 左半部分数组的长度
    int n2 = high - mid;    // 右半部分数组的长度

    int leftArr[n1], rightArr[n2]; // 临时存放左右两个子数组的数组

    // 将数据复制到临时数组
    for (int i = 0; i < n1; i++) {
        leftArr[i] = arr[low + i];
    }
    for (int j = 0; j < n2; j++) {
        rightArr[j] = arr[mid + 1 + j];
    }

    // 将两个子数组合并为一个有序数组
    int i = 0, j = 0, k = low;
    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            i++;
        } else {
            arr[k] = rightArr[j];
            j++;
        }
        k++;
    }

    // 将剩余的元素复制到arr中
    while (i < n1) {
        arr[k] = leftArr[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = rightArr[j];
        j++;
        k++;
    }
}

// 归并排序
void mergeSort(int arr[], int low, int high) {
    if (low < high) {
        int mid = (low + high) / 2;
        mergeSort(arr, low, mid);        // 对左半部分数组进行排序
        mergeSort(arr, mid + 1, high);   // 对右半部分数组进行排序
        merge(arr, low, mid, high);      // 合并左右两个有序数组
    }
}

int main() {
    int arr[] = {5, 2, 7, 1, 3, 6, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    mergeSort(arr, 0, n - 1);

    cout << "排序结果:";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

注意事项

  1. 归并排序是稳定的排序算法,即相等元素的相对位置在排序前后保持一致。
  2. 归并排序的空间复杂度较高,需要额外的空间来存放临时数组。
  3. 在实现过程中,需要注意边界条件的处理,以避免数组越界错误。

使用技巧

  1. 归并排序适用于对大规模数据进行排序,因为其时间复杂度是稳定的。
  2. 如果待排序数组长度较小,可以使用其他简单的排序算法,如插入排序或选择排序。

结论

每天都冒出很多念头,那些不死的才叫做梦想

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

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

相关文章

ros2中ros_gz_bridge/gazebo安装的注意事项

这个搞错了&#xff1a;这个是安装ros_gz_bridge的&#xff0c;不是安装gazebo的 AT:如果是安装的Harmonic&#xff0c;在安装ros_gz_bridge的时候要从源码编译 ros2完整版里面好像已经包含了gazebo的一个版本 包名应该就是叫ros-humble-ros-ign-gazebo 所以gazebo是作为一个普…

使用tesla gpu 加速大模型,ffmpeg,unity 和 UE等二三维应用

我们知道tesla gpu 没有显示器接口&#xff0c;那么在windows中怎么使用加速unity ue这种三维编辑器呢&#xff0c;答案就是改变注册表来加速相应的三维渲染程序. 1 tesla gpu p40 p100 加速 在windows中使用regedit 来改变 核显配置&#xff0c; 让p100 p40 等等显卡通过核显…

docker-compose部署kafka

docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…

国企和互联网怎么选?

2023年马上就要结束了&#xff0c;天气还是很冷&#xff0c;大家今年的总结做了吗&#xff1f; 正好这两天看到另外一个我关注的博主更新了一个自己的年终总结。其中有一些话令人印象深刻。 未来对我来说&#xff0c;毫无吸引力。原因很简单&#xff0c;当下已经足够令人清醒、…

WordPress主题大前端DUX v8.3源码下载

DUX主题8.3版本更新内容&#xff1a; 新增&#xff1a;Cloudflare Turnstile 免费验证功能 新增&#xff1a;子菜单页面模版&#xff0c;支持多级页面 新增&#xff1a;手机端文章内表格自动出现横向滚动条&#xff0c;可集体或单独设置滚动宽度 新增&#xff1a;标签云页面模版…

Linux:jumpserver过滤命令(5)

我们分配完Linux资产后&#xff0c;如果想让用户无法执行某些命令可以直接写入过滤&#xff0c;当执行带有改字段就会自动拒绝 注意&#xff1a;是字段 当我们禁用了passwd&#xff0c;全部带有passwd的东西都会被禁掉 passwd修改密码的命令和/etc/passwd都会被禁了&#xf…

tensorrt环境安装-可用于深度学习模型加速推理

安装python环境 在anaconda的命令行中输入conda create --name py38 python3.8 安装python环境 然后安装深度学习框架pytorch环境 Previous PyTorch Versions | PyTorch 在这里面选择合适的环境 conda install pytorch1.8.0 torchvision0.9.0 torchaudio0.8.0 cudatoolki…

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…

【yolov5问题解决】Dataset autodownload failure

自己下载该数据集 https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip 然后解压放到平行目录下

算法(图网格)-岛屿问题-岛屿数量

岛屿数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…

Qt 中使用 MySQL 数据库保姆级教程(上)

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 在 Qt 中默认只搭载了 QSqlLite 数据库驱动&#xff0c;若要使用其他数据库需要自己下载数据库&#xff0c;并将数据库驱动加载到…

SaaS医院信息化云his系统源码带电子病历+LIS系统

一、系统概述 •采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS 应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同&#xff0c;服务可拆分&#xff0c;功能易扩展&#xff1b; •支持多样化灵活配置&#xff0c;提取大量公共参数&am…

VisualStudio项目中多个同名文件处理

现象 在vs2019环境中&#xff0c;现在开发一个较大的C项目&#xff0c;它的源文件在多个文件夹中组织(在文件系统上)。在其中两个文件夹中&#xff0c;有几个同名的文件。如&#xff1a; .\ConsoleApplication1\JAMGEN_CONFIG_x4_test\firls.c .\ConsoleApplication1\NoiseCo…

网工内推 | 技术支持、解决方案工程师,RHCA认证优先,带薪年假

01 天融信 招聘岗位&#xff1a;售后技术支持工程师 职责描述&#xff1a; 1.负责公司运营商态势安全项目系统远程维护与运营支持工作。 2.负责远程对态势平台、数据探针进行日常巡检&#xff0c;及时发现故障问题&#xff0c;并反馈处置。 3.负责远程支撑态势平台的功能考核&…

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

How to Clean Text for Machine Learning with Python

NLP 在本教程中&#xff0c;您将了解如何清理和准备文本&#xff0c;以便使用机器学习进行建模。 完成本教程后&#xff0c;您将了解&#xff1a; 如何通过开发自己的非常简单的文本清理工具开始。 如何更上一层楼并使用 NLTK 库中更复杂的方法。 在使用现代文本表示方法&am…

论文润色有用吗 神码ai

大家好&#xff0c;今天来聊聊论文润色有用吗&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色有用吗&#xff1f;专业软件助你提升论文质量 一、…

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第二周测验

课程4_第2周_测验题 目录 第一题 1.在典型的卷积神经网络中&#xff0c;随着网络的深度增加&#xff0c;你能看到的现象是&#xff1f; A. 【  】 n H n_H nH​和 n W n_W nW​增加&#xff0c;同时 n C n_C nC​减少 B. 【  】 n H n_H nH​和 n W n_W nW​减少&#x…

【NR技术】 EN-DC移动性流程

1 概述 NR支持LTE和NR共同组网&#xff0c;UE同时连接到eNB和gNB&#xff0c;NSA组网时&#xff0c;EN-DC是一种主流连接方式。 2 EN-DC移动性处理流程 2.1 Inter-gNB-DU Mobility using MCG SRB 在EN-DC操作过程中&#xff0c;当只有MCG SRB可用时&#xff0c;UE从一个gNB-D…