首页 > 其他分享 >归并排序

归并排序

时间:2023-10-10 17:35:32浏览次数:47  
标签:sort 归并 int mid merge 排序

一、算法描述

归并排序,是创建在归并操作上的一种有效的排序算法。

算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。

归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

思路如下:

  1. 取分界点,int mid = (l + r) / 2;
  2. 递归排序左右两段,merge_sort(a, l, mid), merge_sort(a, mid + 1, r);
  3. 归并,合二为一(二路归并)
  • 归并排序取的分界点是区间中点,快排取的是数组中的数。
  • 归并排序时间复杂度也是O(nlogn)
  • 归并排序的空间复杂度是O(n)的,因为要开一个额外的数组来存储排序的数。

二、题目描述

给定你一个长度为 \(n\) 的整数数列。

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

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

输入格式

输入共两行,第一行包含整数 \(n\)。

第二行包含 \(n\) 个整数(所有整数均在 \(1\) ∼ \(10^9\) 范围内),表示整个数列。

输出格式

输出共一行,包含 \(n\) 个整数,表示排好序的数列。

数据范围

\(1 ≤ n ≤ 100000\)

输入样例:

5
3 1 2 4 5 

输出样例:

1 2 3 4 5 

三、原题链接

AcWing787.归并排序

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n;
int a[N];
int tmp[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])   tmp[k ++ ] = a[i ++ ];
        else    tmp[k ++ ] = a[j ++ ];
    while (i <= mid)    tmp[k ++ ] = a[i ++ ];
    while (j <= r)  tmp[k ++ ] = a[j ++ ];
    
    for (int i = 0, j = l; j <= r; ++i, ++ j)   a[j] = tmp[i];
}

int main()
{
    cin >> n;
    
    for (int i = 0; i < n; ++i) cin >> a[i];
    
    merge_sort(a, 0, n - 1);
    
    for (int i = 0; i < n; ++i) cout << a[i] << ' ';
    
    return 0;
}

标签:sort,归并,int,mid,merge,排序
From: https://www.cnblogs.com/grave-master/p/17755268.html

相关文章

  • java stream 操作map根据key或者value排序的实现
    javastream操作map根据key或者value排序的实现publicclassTest02{publicstaticvoidmain(String[]args){List<FundBenchMarkInfo>fundBenchMarkList=newArrayList<>();fundBenchMarkList.add(newFundBenchMarkInfo("2",new......
  • 关于归并排序求逆序对
    之前写了一篇blog讲如何用归并排序求逆序对以及解决相关问题。最近才发现自己根本没搞懂,而且写的不好。遂重写。前言:什么是逆序对?对于数列的第i个和第j个元素,若满足i<j且a[i]>a[j],则其为一个逆序对。归并排序的过程:将序列分为两部分,先递归将两侧序列排序,后将两......
  • 排序数组
       排序数组 数组C++JavaPython前言本题你可以选择直接调用库函数来对序列进行排序,但意义不大。由于排序算法有很多,本文只介绍三种常见的基于比较的复杂度较低的排序。方法一:快速排序思路和算法快速排序的主要思想是通过划分将待排序的序列分成前后两......
  • 数据重整:用Java实现精准Excel数据排序的实用策略
    摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Excel中可以通过排序功能进行整理数据。而在Java中,则可以借助Excel表格插件对数......
  • Map根据value排序取topN
    publicstaticvoidmain(String[]args){Map<String,Integer>map=newHashMap<>();/*for(inti=0;i<1000000;i++){intnextInt=newRandom().nextInt();map.put("A"+i,i*nextInt......
  • C#归并排序算法
    前言归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并并排序,最终得到一个有序的序列。归并排序实现原理将待排序序列分割成两个子序列,直到每个子序列中只有一个元素。......
  • 08_三个数字排序
    三个数字排序!/bin/bashread-p"请输入一个整数:"num1read-p"请输入一个整数:"num2read-p"请输入一个整数:"num3#不管谁大谁小,最后都打印echo"$num1,$num2,$num3"#num1中永远存最小的值,num2中永远存中间值,num3永远存最大值tmp=0if[$num1-gt$num2];t......
  • 递归分治法在快速排序中的应用 java以界面的方式实现
    递归分治法在快速排序中的应用 分治法的基本思想§分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。 k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求......
  • 输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
    [12:38:09root@centos8~]#bashsort.shbeforesort:1475626459133973060324422175901602255661082520888121022092421146668557255975852542867817400aftersort:3060328678264592442220888175901740016022147561339711466108259758924272......
  • 前端歌谣的刷题之路-第三十七题-从大到小排序
     目录前言题目编辑 核心代码总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛......