排序算法:归并排序算法

文章目录

一、归并排序算法简介

归并排序(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 << " ";
}
相关推荐
Dlrb12112 小时前
C语言-指针三
c语言·算法·指针·const·命令行参数
Tisfy3 小时前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
IronMurphy3 小时前
【算法四十七】152. 乘积最大子数组
算法
淘矿人4 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar4 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈6 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
Godspeed Zhao7 小时前
从零开始学AI16——SVM
算法·机器学习·支持向量机
江屿风7 小时前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法