排序算法:归并排序算法

算法:排序算法之归并排序 前几回,在前面已经对冒泡排序、直接插入排序、希尔排序、选择排序、快速做了说明分析(具体详情可点击下方的链接查看)。这回,将对归并排序进行相关说明分析。 一、排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Merge... 阅读详情

一、归并排序算法简介

归并排序(Merge Sort) 是一种典型的分治(Divide & Conquer) 排序算法。一句话总结:先拆分到最小,再两两合并成有序序列

核心特点:

  • 稳定排序
  • 特别适合 大数据 / 外排序 / 链表

归并排序的核心思想
归并排序分三步:

  1. 分(Divide):把数组递归地一分为二
  2. 治(Conquer):对子数组排序
  3. 合(Merge):将两个有序数组合并成一个有序数组

二、图示解析

假设数组:

[8, 3, 1, 7, 0, 10, 2]

分裂阶段(递归拆分)

                [8, 3, 1, 7, 0, 10, 2]
                         |
              --------------------------------
              |                              |
        [8, 3, 1]                     [7, 0, 10, 2]
           |                                  |
      -----------                      -----------------
      |         |                      |               |
    [8]      [3,1]                  [7,0]           [10,2]
               |                      |                 |
            [3] [1]                [7] [0]           [10] [2]

合并阶段(关键步骤)
合并 [3] 和 [1]

[1, 3]

合并 [8] 和 [1, 3]

[1, 3, 8]

合并 [7] 和 [0]

[0, 7]

合并 [10] 和 [2]

[2, 10]

合并 [0,7] 和 [2,10]

[0, 2, 7, 10]

最终合并

[1, 3, 8] + [0, 2, 7, 10]
        ↓
[0, 1, 2, 3, 7, 8, 10]

三、时间 & 空间复杂度分析

时间复杂度(非常稳定)
在这里插入图片描述
空间复杂度:O(n)(需要辅助数组)

四、归并排序完整示例代码

#include <iostream>
#include <vector>
using namespace std;

/* ---------------- 合并两个有序区间 ---------------- */
void merge(vector<int>& arr, int left, int mid, int right)
{
    vector<int> temp;
    int i = left;
    int j = mid + 1;

    while (i <= mid && j <= right)
    {
        if (arr[i] <= arr[j])
            temp.push_back(arr[i++]);
        else
            temp.push_back(arr[j++]);
    }

    while (i <= mid) temp.push_back(arr[i++]);
    while (j <= right) temp.push_back(arr[j++]);

    for (int k = 0; k < temp.size(); k++)
        arr[left + k] = temp[k];
}

/* ---------------- 归并排序 ---------------- */
void mergeSort(vector<int>& arr, int left, int right)
{
    if (left >= right) return;

    int mid = (left + right) / 2;

    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);
}

int main()
{
    vector<int> arr = {8, 3, 1, 7, 0, 10, 2};

    mergeSort(arr, 0, arr.size() - 1);

    for (int x : arr)
        cout << x << " ";
}
改进排序算法:归并排序 堆排序:利用了完全二叉树的特性,深度是[log2n]+1,所以效率比较高。 一般,涉及到完全二叉树结构的排序算法,效率都不低。 归并:将两个或两个以上的有序表组合成一个新的有序表。 归并排序(2路归并排序):假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,..., 阅读详情

相关推荐

C++排序算法:归并排序详解

C++排序算法:归并排序详解

小天狼星_布莱克 的博客 3万+

【算法】【python】排序算法:插排、快排、归并排序

排序算法 一、 插入排序(insertion sort) 1.1定义 在插入排序中,从前到后一次处理未排好序的元素,对于每个元素,我们将它与之前排好序的元素进行比骄傲,找到对应的位置后插入。 1.2 步骤 从第二个蒜素(第一个要被排序的新元素)开始,从后向前扫描之前的元素序列 如果当前扫描的元素大于新元素,将扫描元素移动到下一位 重复步骤2,知道找到一个小于或者等于新元素的位置 将新元素插入到该位置 对于之后的元素重复步骤1-4 import numpy as np def insertion_s

panbaoran913的博客 520

掌握排序算法:从冒泡到归并排序

本博客文章详细介绍了冒泡排序、选择排序、插入排序和归并排序四种基本的排序算法。通过具体的代码示例和算法步骤,展示了每种排序算法的工作原理和应用场景。

weixin_34640289的博客 270

java排序算法:归并排序

java排序算法:归并排序

mr557的博客 298

手把手教你用Qt5打造二次元游戏启动器(附鸣潮同款UI源码)

本文详细介绍了如何使用Qt5框架从零开始构建一个功能完整、UI风格贴近《鸣潮》的二次元游戏启动器。教程涵盖无边框窗口、动态背景、自定义控件绘制、多线程资源加载以及下载管理等核心模块的实现,并提供了可运行的源码参考,帮助C++开发者和Qt爱好者深入掌握现代桌面应用开发技术。

weixin_29291863的博客 263

python语言下使用opencv接口cv2.VideoCapture()接口调用海康机器人工业相机

文章目录 目录 文章目录 前言 一、opencv接口介绍 二、调用海康机器人工业相机 1.使用海康机器人工业相机的前提 2.调用海康机器人工业相机进行显示 3.调用海康机器人工业相机进行存图 4.调用海康机器人工业相机存视频 5.调用海康机器人工业相机进行简单图像处理 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下.

qq_39570716的博客 1万+

java 排序算法&&复杂度(举例:冒泡排序、快速排序、归并排序)

Java中常见的排序算法有以下9种: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序(Heap Sort) 希尔排序(Shell Sort) 计数排序(Counting Sort) 桶排序(Bucket Sort)

DJyzh的博客 2440

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 276

算法入门排序算法:归并排序

归并排序是一种采用分治策略的高效排序算法,其核心思想是将数组递归分解为单元素子数组后再有序合并。Java实现包含递归和迭代两种版本,递归版本通过分解-排序-合并三步骤实现,而迭代版本采用自底向上的方式逐步扩大子数组规模。代码还展示了并行化处理和性能测试方法,体现了该算法在最坏情况下仍保持O(n log n)时间复杂度的优势。归并排序的稳定性使其成为处理大规模数据的可靠选择。

无聊了,不玩了 1655

新手必看!华为S5700交换机健康检查清单:从CPU到日志的完整巡检流程

本文为新手网管人员提供华为S5700交换机的健康检查完整指南,涵盖CPU、内存、温度、日志等核心指标的日常维护流程。通过详细的display命令和实用案例,帮助用户快速掌握设备体检技巧,确保交换机稳定运行。

weixin_29251337的博客 236

JAVA:Spring Boot3 集成 Spring AI 实现 Skill 开发

本文介绍了如何通过Spring Boot和Spring AI实现大模型技能(Skill)开发,让AI具备调用业务系统能力。文章首先解释了Skill的概念,即AI可调用的业务能力,如查询订单、天气等,并展示了执行流程和整体架构。然后详细介绍了实践样例,包括技术版本、Maven依赖配置、AI服务设置、ChatClient创建和Skill技能注册中心的实现。注册中心提供了技能的注册、查询、启用/禁用等功能,支持按类别管理技能,并能够获取所有可用技能列表。通过这种方式,开发者可以轻松为大模型扩展业务功能调用能力。

木头 620

java排序算法第六弹:归并排序

#你真的懂排序吗? 排序算法第六弹:归并排序: 第一步:初始化数组,长度为10,并给该数组随机赋值 第二步:归并排序逻辑实现 运行结果: 下一期:我们分享算法排序第7弹:基位排序! 往后我还会继续分享:冒泡排序,地精排序,“猴子排序”,双调排序,睡眠排序,面条排序,pig排序,鸡尾酒排序! ...

rockyfree的博客 153

在SAP系统中创建物料 860000000000000082(物料描述为“8680月球广寒宫坦克车”)时,系统报出了一个错误

摘要:SAP系统创建物料"8680月球广寒宫坦克车"时出现"C+020"错误,提示评估区域C916未在物料分类账中设置为生产性。解决方案需进入"会计-控制-产品成本控制-实际成本核算"路径,将评估区域C916手动设置为生产性状态。该操作需由具备权限的系统管理员或FICO顾问执行,建议操作前进行数据备份或在测试环境验证。完成设置后即可重新创建物料。

金牌架构师 391

排序算法:归并排序

前言 这篇文章本该发表于2018年4月份末,在排序算法:快速排序之后,但是不知道什么原因,这篇文章忘了在优快云上发表,今天在看博客的时候突然发现,因此补上。 概述 之前介绍过排序算法中效率很高的“快速排序”。本文将介绍另一个高效的排序算法——“归并排序”。 基本思想 归并排序的主要思想是分治法。主要过程是: 将n个元素从中间切开,分成两部分。(左边可能比右边多1个...

程序员囧辉 3672

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 519

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

排序算法:快排、堆排序、归并排序

几种排序的总结(含重复用元素):https://blog.youkuaiyun.com/weixin_46544385/article/details/107131501 快排一: 遇到相同的元素,元素可能在前半部分,也可能在后半部分。 8,8,0,9,4,10,5 8,0,9,4,10,8 ...

weixin_44021967的博客 253

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

排序算法:归并排序,golang实现

在实际场景中,选择合适的排序算法对于提高程序的效率和性能至关重要,本节课主要讲解"归并排序"的适用场景及代码实现。

幸享龙枫的博客 1694

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

归并排序执行次数_【C++课外内容】第3期:排序算法

同学们好!本期C++课外内容将介绍几种排序算法的相关内容。仅给出算法的实现原理,不会涉及具体的代码实现。希望通过此篇推送,同学们能够对各种排序算法有初步的认识,并了解其优缺点。01插入排序直接插入排序(Straight Insertion Sort)的算法思路是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,从而找到相应的位置并插入。在从后向前扫描过程中,需要反复把已排序...

weixin_39631094的博客 334

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

排序算法3:归并排序与计数排序

Hello,小伙伴们,今天我们继续排序算法的学习,大家三连上车不迷路,我们现在开始今天的学习!!!

2302_79964175的博客 967

Day027: 列表的排序算法:归并排序

在数据结构与算法的学习中,排序算法是基础且重要的一部分。归并排序作为排序算法中的一种,以其高效的时间复杂度和稳定性,成为实际应用中常用的排序算法之一。本文将详细介绍归并排序算法的原理、实现方法、性能分析以及应用场景,帮助读者全面掌握这一经典算法。

u014481728的博客 1408

C 排序算法:归并排序

C 排序算法:归并排序 一、实现 #include<stdio.h> void quickSort(int *p, int left, int right); void disArr(int *p,int size); int main() { int arr[] = {1,9,8,7,0,2}; quickSort(arr,0, sizeof(arr) / sizeof(*ar...

Bryan_QAQ的博客 364

排序算法系列:归并排序算法

上一篇我们说了一个非常简单的排序算法——选择排序。其复杂程序完全是冒泡级的,甚至比冒泡还要简单。今天要说的是一个相对比较复杂的排序算法——归并排序。复杂的原因不仅在于归并排序分成了两个部分进行解决问题,而是在于,你需要一些算法的思想支撑。

大鱼 2万+

排序算法(四):归并排序

归并排序作为一种经典的分治算法,在处理大规模数据时展现了其强大的性能和稳定性。它通过递归地分割和合并来实现排序,其时间复杂度为O(n log n),是一个理想的稳定排序算法。尽管它的空间复杂度较高,且实现相对复杂,但在许多应用场景中,归并排序仍然是一个非常有效的排序工具。在选择排序算法时,我们可以根据实际情况选择合适的算法,例如对于大规模数据或者需要稳定排序的场景,归并排序无疑是一个优选。而对于小规模数据,插入排序或快速排序可能会更高效。

一碗黄焖鸡三碗米饭的博客 1249
上一篇: 排序算法:快速排序算法
下一篇: 排序算法:基数排序算法
TechNomad
博客等级 码龄2年 787粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值