排序算法:归并排序算法

文章目录

一、归并排序算法简介

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

核心特点:

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

归并排序的核心思想

归并排序分三步:

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

二、图示解析

假设数组:

cpp 复制代码
[8, 3, 1, 7, 0, 10, 2]

分裂阶段(递归拆分)

cpp 复制代码
                [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]

合并阶段(关键步骤)

合并 31

cpp 复制代码
[1, 3]

合并 81, 3

cpp 复制代码
[1, 3, 8]

合并 70

cpp 复制代码
[0, 7]

合并 102

cpp 复制代码
[2, 10]

合并 0,72,10

cpp 复制代码
[0, 2, 7, 10]

最终合并

cpp 复制代码
[1, 3, 8] + [0, 2, 7, 10]
        ↓
[0, 1, 2, 3, 7, 8, 10]

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

时间复杂度(非常稳定)

空间复杂度:O(n)(需要辅助数组)

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

cpp 复制代码
#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 << " ";
}
相关推荐
奋发向前wcx1 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
战族狼魂4 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一5 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH5 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱5 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
香辣牛肉饭6 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
旖-旎7 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
.徐十三.7 小时前
一篇文章看到最短路径——Dijkstra算法
算法
科学实验家8 小时前
二叉树的几道题
算法