AcWing学习——归并排序

1. 概念

归并排序与快速排序有异曲同工之处,同样是利用到了分治思想,但是归并排序还利用到了归并的思想,将原数组依次分治,形成最小的有序子数组,然后俩俩归并,依次形成一个更大的有序子数组,直到原数组完全有序为止。

后续介绍均采用递增排序

2. 步骤

  1. 确定分界点:一般采用当前数组最中间的数作为分界点(记为X)。
  2. 递归处理:对中间数X的左右两个子数组依次递归重复第一步操作找分界点,直到子数组长度为1为止。可以理解为以分界点X开始,生成一个二叉树,左子树为X左边的元素,右子树为X右边的元素。
  3. 归并处理:依次对每两个最小的有序子数组进行归并,使其成为一个更大的有序子数组。可以理解为从二叉树的结点开始,依次向上合并到父节点元素,并使当前合并后的结点内成为一个有序子数组。直到原数组完全有序为止。

3. 重难点

归并排序的重难点主要是第三步,如何对有序子数组进行归并,成为一个更大的有序子数组。

3.1. 双指针

我们需要利用到一个额外的数组,此数组长度为两个子数组的总长度,再利用头指针i指向第一个子数组首部,头指针j指向第二个子数组首部,依次对两个子数字进行遍历,依次将i指针j指针指向的最小的元素依次存入额外数组中,再对指针自增,直到其中一个指针超过其所指向的子数组的长度,就将另一个子数组依次填入额外数组中。

每一趟归并中,仅需要O(N)空间复杂度 以及O(N)时间复杂度

4. 代码模板

c++ 复制代码
#include <iostream>

using namespace std;

const int N = 1000010;

int n;
int q[N], tmp[N];

void merge_sort(int q[], int l, int r) 
{
    if(l >= r) return;
    
    int mid = l + r >> 1; // 取中间值
    
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    
    int k = 0;
    int i = l;
    int j = mid + 1;
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
       
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];
    
    for(int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}

int main()
{
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    merge_sort(q, 0, n-1);
    
    for(int i = 0; i < n; i++) printf("%d ", q[i]);
    
    return 0;
}

5. 复杂度分析

元素组长度为N的情况下,在递归的情况下,空间复杂度为O(logN),而时间复杂度为O(NlogN),共进行logN趟 排序,而每趟排序的时间复杂度为O(N)

相关推荐
汉克老师10 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood10 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz10 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕11 小时前
进一步了解模板
c++
汉克老师13 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs66614 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
风合星语15 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
91刘仁德16 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西16 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海16 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人