基础算法-归并排序

简介: 与快速排序的分治不同,快速排序 通过一个分界点,使得小于分界点的数都在分界点左边,大于分界点的数都在分界点右边;而 归并排序 是以整个数组最中心的位置来分

基本思想——分治

快速排序的分治不同,快速排序 通过一个分界点,使得小于分界点的数都在分界点左边,大于分界点的数都在分界点右边;而 归并排序 是以整个数组最中心的位置来分。


具体步骤

  1. 确定分界点: mid=l+r>>1;
  2. 递归排序左右两边,得到两个有序的数组。
  3. 将两个有序的数组合并为一个有序的数组。



数组合并

定义一个中间数组,通过双指针进行比较,假定指针1对应值小于指针2对应值,便将指针1对应值放入中间数组当中,指针1向后移动一位,中间数组待放入位置也向后移动一位,反之也是如此,这样循环往复便在中间数组当中得到一个有序数列。


需要注意的是,如果指针1所在数组率先放入完成,还需将指针2所在数组放入,因此,在最后还需检查两个数组是否还存有剩余值。


思路演示

0991c57d9a3b48a887398f02d22f5d98.gif


题目描述

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

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

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



输入格式

输入共两行。

第一行包含整数 n。

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


输出格式

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

数据范围

1≤n≤100000


输入样例

5

3 1 2 4 5

输出样例

1 2 3 4 5

实现代码


#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
int q[N],tmp[N];
void merge_sort(int q[],int l,int r)
{
    if(l>=r)
    {
        return;
    }
    else
    {
        int mid=l+r>>1;
        merge_sort(q,l,mid);
        merge_sort(q,mid+1,r);
        int k=0,i=l,j=mid+1;
        while(i<=mid&&j<=r)
        {
            if(q[i]<=q[j])
            {
                tmp[k]=q[i];
                k++;
                i++;
            }
            else
            {
                tmp[k]=q[j];
                k++;
                j++;
            }
        }
        while(i<=mid)
        {
            tmp[k]=q[i];
            k++;
            i++;
        }
        while(j<=r)
        {
            tmp[k]=q[j];
            k++;
            j++;
        }
        for(i=l,j=0;i<=r;i++,j++)
        {
            q[i]=tmp[j];
        }
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
    }
    merge_sort(q,0,n-1);
    for(int i=0;i<n;i++)
    {
        cout<<q[i]<<" ";
    }
    system("pause");
    return 0;
}




相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
22天前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
34 0
|
4月前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
27 0
|
22天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
15 0
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
64 4
|
2月前
|
算法 搜索推荐 C#
|
3月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
34 3
|
3月前
|
算法
数据结构与算法-归并排序
数据结构与算法-归并排序
24 2
|
4月前
|
存储 搜索推荐 算法
归并排序算法深入解析
归并排序算法深入解析
|
3月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
20 0