排序算法之归并排序

C++排序算法:归并排序详解 阅读详情

归并思想

  1. 定义初始情况。若出现初始情况则直接进行处理,处理完毕直接返回,结束。
  2. 将原问题拆分成两个相同的子问题。
  3. 解决子问题。
  4. 合并两个子问题的解。

归并排序

1、初始情况

只有一个元素时,区间已排好序,直接返回。

2、拆分原问题

以位置为标准将要排序的区间 [ L , R ] [L,R] [L,R] 一分为二,尽可能分的均匀一些。设 m i d = ⌊ L + R 2 ⌋ + L mid=\lfloor\frac {L+R} 2\rfloor+L mid=⌊2L+R​⌋+L ,则原问题拆分成子问题 [ L , m i d ] [L,mid] [L,mid] 和子问题 [ m i d + 1 , R ] [mid+1,R] [mid+1,R]。

3、解决子问题

递归进行对子问题的排序。

4、合并子问题的解

这一步是归并排序中最关键的一步:合并。
维护两个指针(我使用 i , j i,j i,j ,当然你也可以用其他名字命名),初始时分别指向两个子问题的队首。每次比较 i i i 和 j j j 指向的元素,将较小的元素加入临时数组 t m p tmp tmp 储存。直到一个指针已经指向它所在子问题的队尾,将另一个子问题剩下的元素全部加入到临时数组 t m p tmp tmp 储存。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int a[N], b[N];
void Merge(int *a, int l, int mid, int r, int *t) {
    int i = l, j = mid + 1, index = l;
    while (i <= mid && j <= r) {
        if (a[i] < a[j]) t[index++] = a[i++];
        else t[index++] = a[j++];
    } while (i <= mid) t[index++] = a[i++];
    while (j <= r) t[index++] = a[j++];
    for (i = l; i <= r; ++i) a[i] = t[i];
}
void MergeSort(int *a, int l, int r, int *t) {
    // 1.基本情况
    if (l == r) return;
    // 2.拆分原问题
    int mid = l + (r - l) / 2;
    // 3.解决子问题
    MergeSort(a, l, mid, t);
    MergeSort(a, mid + 1, r, t);
    // 4.合并子问题的解
    Merge(a, l, mid, r, t);
}
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    MergeSort(a, 0, n - 1, b);
    for (int i = 0; i < n; ++i) cout << a[i] << ' ';
    cout << endl;
    return 0;
}
国产SR8201F以太网PHY芯片调试避坑指南:从机贴失败到杜邦线救场的实战记录 本文详细介绍了国产SR8201F以太网PHY芯片的调试避坑指南,涵盖硬件设计、PCB布局、SMT贴片及软件驱动等关键环节。通过实战案例解析,帮助工程师解决MII/RMII接口配置、电源设计、信号完整性等典型问题,提升以太网通信稳定性与EMC性能。 阅读详情

相关推荐

HFSS实战:手把手教你设计微带发夹线滤波器(附完整参数计算流程)

本文详细介绍了使用HFSS设计微带发夹线滤波器的完整流程,包括参数计算、HFSS建模和优化策略。通过实战案例,帮助读者掌握微波滤波器设计的核心技巧,特别是奇偶模阻抗计算和HFSS仿真中的关键设置,适用于通信系统设计和射频工程应用。

weixin_29251567的博客 441

排序之归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。所谓归并,就是将两组有序的数据合成为一组有序的数据,例如有如下两个有序数组,将两个有序数组归并为一个有序数组,这就是一次归并操作。

dong132697的博客 2万+

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

【归并排序】C语言实现归并排序

归并排序(MERGE–SORT)是建立在归并操作上的一种有效的排序算法该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。先进行一个一个数比较,在两个两个的比较…实录基本和上面的一样,越界处理不同。,把两组进行排序,接着排序进。比照函数,一步一步分析。递归函数是把数组分至为。

Code哈哈笑的博客 1090

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1665

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 508

归并排序详解

摘要:归并排序是我们常用的八大排序中的一种,其排序思路中和快速排序算法一样使用到了递归的思想,同时在归并排序中还用到了一个算法,就是有序数组合并算法。配合递归与有序数组合并算法,归并排序能够高效且稳定的完成排序,归并排序的优点在于其时间复杂度低,稳定性高,但是缺点也是有的,那就是空间复杂度很高。

云杉木屋 2万+

农业生产AI决策系统架构设计解密:数据层-模型层-应用层核心逻辑

想象一下,在一个炎热的夏日,传统农田里的农民伯伯正满头大汗地检查每一株玉米是否缺水;而几公里外的智慧农场里,一位年轻农民正在空调房里滑动手机屏幕,看着AI系统自动生成的灌溉计划——这就是农业生产AI决策系统带来的改变。本文的目的,就是要揭开这个"智能农业大脑"的面纱,详细讲解它的"身体构造"(架构设计)和"工作原理"(核心逻辑)。我们将聚焦系统最核心的三个部分:数据层(收集农田信息)、模型层(分析信息并思考决策)和应用层(将决策告诉农民)。

AI智能探索者的博客 1326

【数据结构详解】——归并排序(动图详解)

💡 算法思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用**分治法**的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为**二路归并**。

HinsCoder的博客 1万+

开关电源-LLC基本原理

本文详细介绍了LLC谐振变换器的兴起原因、基本工作原理、变换器特点及拓扑结构。重点讨论了半桥、全桥LLC及其软开关技术,包括零电压开关(ZVS)和零电流开关(ZCS)。通过理解简单的谐振电路(RL、RC、LC)来阐述LLC如何改变电压增益,以及如何通过调节频率实现输出电压的稳定性。

让你爱上电路设计 2万+

破盾实录|Vueling航空阿卡迈防护逆向:从503挑战到Cookie生成的全流程拆解

摘要:文章分享了作者在爬取西班牙伏林航空(Vueling)机票数据时,遭遇阿卡迈(Akamai)防护系统的实战经历。起初简单的请求被拦截返回503错误,分析发现阿卡迈通过混淆JS代码实施"挑战-验证"机制,需模拟真实浏览器环境才能获取有效Cookie。作者详细拆解了逆向过程:从抓包分析JS挑战流程,到破解代码混淆和控制流平坦化,最终用Python+Pyppeteer成功模拟浏览器特征,突破防护获取数据。整个过程涉及JS反混淆、环境检测绕过和Cookie生成验证等关键技术点,为类似防护系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1642

归并排序

归并排序 public class MergeSort { public static void main(String[] args) { int i = 0; int a[] = { 5, 4, 9, 7, 8, 0, 6, 1, 3, 2 }; int len = a.length; MergeSort(a, 0, len - 1); for (Integer x

Shangri-La 1004

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 399

【排序算法】—— 归并排序

合并的具体思路:定义三个指针分别指向第一、二个序列和临时序列的第一个元素,然后对指针指向的元素进行比较,将较小的那一个元素添加到临时序列中,随即将对应的指针往后移动一位,直到指向第一个序列或第二个序列的指针走完,因为两个序列都是有序的,所以此时将没有走完的指针所指向的位置的后面所有元素都放入临时序列中即可。因此,我们的问题就得以解决了,第一步就是。来判断此时序列中元素的个数和该子序列在整个序列中的具体位置,然后不断将其从中间进行分割,直到只有一个元素,此时退出递归,回到上一层,进行合并即可。

2302_80243065的博客 2041

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【十大排序算法】归并排序

归并排序,如同秋日落叶,分散而细碎, 然而风吹叶动,自然而有序, 彼此相遇,轻轻合拢, 最终成就,秩序之谧。

DC1020的博客 1175

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

排序算法之归并排序分析

归并排序 排序思想: 归并排序使用的就是分治思想,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 这种将大问题分解成小问题的思想与递归很像,分治和递归的区别就是:分治是一种解决问题的处理思想,递归是一种编程技巧 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序...

qq_42006733的博客 1938

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【排序算法】 ——— 归并排序总结

文章目录

Lebron 858

十大排序算法之归并排序

一、算法简介 归并排序(Merge sort)是建立在归并操作上的一种稳定、有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 实现方法分为 自上而下的递归 自下而上的迭代 二、原理 1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再...

一只小白的博客 1046

排序算法之 - 归并排序

归并排序也有类似于快速排序的 切割 的过程,但是快速排序会选择基准值,而归并排序则直接将列表 尽可能两等分(若长度为奇数,那么有一侧会少一个元素,左侧还是右侧是无妨的)。当分割到左右两侧都只剩下一个元素的时候,分割完成,开始往上层拼接结果。拼接的大致流程是:取左右两侧队首的元素,比较两者大小,较小的先进入已排序列表。重复执行此流程,直至有一侧为空,将另一侧剩余元素直接合并到已排序列表的右侧。鬼归...

我希望,快乐,在我走过的地方绽放。。。。 8504

排序算法——归并排序

排序算法——归并排序 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 例如一组数组{9,8,7,6,5,4,3,2,1}使用归并排序顺序排序,可分割为{9,8,7,6,5}和{4,3,2,1},{9,8,7,6,5}可分割为{9,8,7}和{6,5},{9,8,7}可分割为{9,8}和{7},{9,8}可分割为{9}和{8},对{9}和{8}归并得到{8,9},第一趟数组完

程序员之道 296

归并排序思想及其他排序算法的比较次数和交换次数

一.归并排序思想 二.合并两个排序数组 三.其他排序算法比较次数和交换次数总结

mudooo的博客 8990
上一篇: 排序算法之插入排序
下一篇: C++埃氏筛
peter_code
博客等级 码龄5年 41粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值