787. 归并排序

文章目录

Question

给定你一个长度为 n

的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n

第二行包含 n

个整数(所有整数均在 1∼109

范围内),表示整个数列。

输出格式

输出共一行,包含 n

个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:

5

3 1 2 4 5

输出样例:

1 2 3 4 5

Ideas

Code

cpp 复制代码
// 归并排序步骤
// 1. 选取中间点
// 2. 递归左右区间
// 3. 合并两个区间
#include <iostream>

using namespace std;
const int N = 1e5 + 10;
int a[N], tem[N];

void merge_sort(int *a, int l, int r)
{
    if (l >= r) return;
    
    int mid = l + r >> 1;
    
    merge_sort(a, l, mid), merge_sort(a, mid + 1, r);
    
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r)
    {
        if (a[i] <= a[j]) // 稳定
            tem[k ++] = a[i ++];
        else
            tem[k ++] = a[j ++];
    }
    while(i <= mid)
    {
        tem[k ++] = a[i ++];
    }
    while(j <= r)
    {
        tem[k ++] = a[j ++];
    }
    for (int i = l, j = 0; i <= r; i ++)
    {
        a[i] = tem[j ++ ];
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
    
    merge_sort(a, 0, n - 1);
    
    for (int i = 0; i < n; i ++) printf("%d ", a[i]);
    
    return 0;
}
相关推荐
爱编程的鱼39 分钟前
C# 数组&C# 多维数组
数据结构·算法·c#
前端开发工程师请求出战1 小时前
MCP — 让AI变得更“百搭”
算法
人机与认知实验室2 小时前
人机环境空战矩阵
人工智能·线性代数·算法·机器学习·矩阵
百度Geek说2 小时前
5个技巧让文心快码成为你的后端开发搭子
后端·算法
上海迪士尼352 小时前
除自身以外数组的乘积是什么意思
数据结构·算法
数据智能老司机2 小时前
Python 实战遗传算法——遗传算法导论
python·算法·机器学习
咩?2 小时前
支持向量机(第二十九节课内容总结)
算法·机器学习·支持向量机
EulerBlind2 小时前
【机器学习】从KNN算法到图像风格迁移:原理与实践
人工智能·算法·机器学习
anscos3 小时前
设计仿真 | 从物理扫描到虚拟检具:Simufact Welding革新汽车零部件检测
人工智能·算法·汽车·软件
tianchang3 小时前
JS 排序神器 sort 的正确打开方式
前端·javascript·算法