排序算法:归并排序算法

文章目录

一、归并排序算法简介

归并排序(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]

合并阶段(关键步骤)

合并 [3] 和 [1]

cpp 复制代码
[1, 3]

合并 [8] 和 [1, 3]

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

合并 [7] 和 [0]

cpp 复制代码
[0, 7]

合并 [10] 和 [2]

cpp 复制代码
[2, 10]

合并 [0,7] 和 [2,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 << " ";
}
相关推荐
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo1 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ01 天前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法