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;
}
相关推荐
仰泳的熊猫2 小时前
题目1453:蓝桥杯历届试题-翻硬币
数据结构·c++·算法·蓝桥杯
唐梓航-求职中2 小时前
技术-算法-leetcode-1606. 找到处理最多请求的服务器(易懂版)
服务器·算法·leetcode
啊阿狸不会拉杆3 小时前
《机器学习导论》第 10 章-线性判别式
人工智能·python·算法·机器学习·numpy·lda·线性判别式
会叫的恐龙3 小时前
C++ 核心知识点汇总(第11日)(排序算法)
c++·算法·排序算法
twilight_4693 小时前
机器学习与模式识别——线性回归算法
算法·机器学习·线性回归
玄同7653 小时前
Python Random 模块深度解析:从基础 API 到 AI / 大模型工程化实践
人工智能·笔记·python·学习·算法·语言模型·llm
爱吃生蚝的于勒3 小时前
【Linux】线程概念(一)
java·linux·运维·服务器·开发语言·数据结构·vim
Pluchon3 小时前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法
独断万古他化3 小时前
【算法通关】前缀和:和为 K、和被 K整除、连续数组、矩阵区域和全解
算法·前缀和·矩阵·哈希表
历程里程碑3 小时前
普通数组-----除了自身以外数组的乘积
大数据·javascript·python·算法·elasticsearch·搜索引擎·flask