《算法之美》---归并排序

数据结构与算法之美 | 学习笔记09 ——归并排序&快速排序 归并排序和快速排序都用到了分治思想,的时间复杂度都为O(nlogn)O(nlogn)O(nlogn),适合大规模的数据排序。 一、归并排序(Merge Sort) 1. 归并排序实现 分治算法一般都是用递归来实现的,分治是解决问题的处理思想,递归是一种编程技巧。用递归来代码实现归并排序,首先写出递推公式的伪代码: 递推公式: merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r)) //下标p到r之间的数组排序,转化为p到q和q+1到r的数组排 阅读详情

将一个大序列的排序问题分解为对两个或多个子序列的排序问题,然后对子序列递归使用同样的方式进行排序;在子序列排好序后,将结果合并起来即可。利用这种思想的排序方法就是著名的归并排序。之所以称为归并排序,是因为整个算法的成本由归并部分决定。

 

归并算法描述如下:

1)如果n=1,排序完成;

2)将序列分解为两个子序列A[1 … ceiling(n/2)]和A[ceiling(n/2)+1 … n];

3)递归对子序列A[1 … ceiling(n/2)]和A[ceiling(n/2)+1 … n]进行排序;

4)将排好序的两个子序列进行归并。

 

归并排序使用的是分治策略,而分治策略的关键是分解和合并。归并排序的分解很简单:直接将序列从中间斩断;但合并的时候需要将两个排好序的子序列按次序进行合适的穿插,从而获得原序列的一个排序。

合并时我们使用两个指针:一个指向A序列里下一个要归并的元素,一个指向B序列里下一个要归并的元素。每步我们对这两个指针所指的元素进行比较,小者被归并到C序列里,并将指向较小者的指针往后推进一个元素,另一个指针保持不动。这样循环往复直到一个子序列为空。这时,另一个子序列中剩下的所有元素直接复制到C序列末尾即可。

 

注意:归并排序在最坏、平均和最好情况下时间复杂度都是Θ(nlogn)。这是归并排序一个显著的特点:一视同仁。

/*

函数名:      MergeSort

功能:        归并排序

模板参数说明:T必须支持小于操作

参数说明:    data待排序数组, size待排序数组大小

前置条件:    data!=NULL, size>0

后置条件:    data按非降序排列

用法:  

#include <algorithm>

int arr[]={10,9,8,4,5,7,6,3,1,4};

MergeSort(arr, 10);

*/

template <typename T>

void MergeSort (T data[], int size)

{

         if ( size>1 )

         {

                   //预处理

                   int mid=size/2;

                   int numOfleft=mid;

                   int numOfright=size-mid;

                   T* left=new T[numOfleft];

                   T* right=new T[numOfright];

                   //分解

                   std::copy(data, data+numOfleft, left);

                   std::copy(data+numOfleft, data+size, right);

                   MergeSort(left, numOfleft);

                   MergeSort(right, numOfright);

                   //合并

                   std::merge(left, left+numOfleft, right, right+numOfright, data);

                   //清理

                   delete[] left;

                   delete[] right;

         }

}

 

/*

函数名:      MergeSort

功能:        归并排序

模板参数说明:T元素类型, Func函数对象或指针

参数说明:    data待排序数组, size待排序数组大小,f函数对象或指针

前置条件:    data!=NULL, size>0

后置条件:    data按f排列

用法:  

#include <algorithm>

bool cmp(int a, int b)

{ return a<b; }

int arr[]={10,9,8,4,5,7,6,3,1,4};

MergeSort(arr, 10,cmp);

*/

template <typename T, typename Func>

void MergeSort (T data[], int size, Func f)

{

         if ( size>1 )

         {

                   int mid=size/2;

                   int numOfleft=mid;

                   int numOfright=size-mid;

                   T* left=new T[numOfleft];

                   T* right=new T[numOfright];

                   std::copy(data, data+numOfleft, left);

                   std::copy(data+numOfleft, data+size, right);

                   MergeSort(left, numOfleft, f);

                   MergeSort(right, numOfright, f);

                   std::merge(left, left+numOfleft, right, right+numOfright, data, f);

                   delete[] left;

                   delete[] right;

         }

}

 

 

美团校招面试算法题库大全 《2024美团校招面试算法题库大全》 关键词:美团校招、面试、算法、题库、2024 摘要: 本文旨在为准备2024年美团校招的候选人提供一套全面且深入的算法题库解析。文章将分为三大部分:第一部分深入讲解算法基础与核心概 阅读详情

相关推荐

Isaac Lab强化学习实战:用SO-ARM101机械臂实现抓取任务(附B站视频教程)

本文详细介绍了如何使用Isaac Lab强化学习框架,在SO-ARM101机械臂上实现抓取任务的完整实战流程。内容涵盖从环境搭建、奖励函数设计、训练调参到模型部署的各个环节,并分享了Sim-to-Real迁移的关键技巧,旨在帮助开发者高效完成机器人强化学习项目。

weixin_29070721的博客 1102

数据结构和算法之美_12_归并排序、快速排序

归并排序(merge sort) 一、什么是归并排序? 使用归并排序对一组数据排序,首先将数据分为两个部分,再对两部分数据重新排序,最后将排序后的两部分数据合并成一组数据并使它有序。 归并排序算法采用了分治思想,分治就是将一个大问题分解成各个小的子问题来解决,和用递归解决问题的思路很像,事实上使用分治思想解决问题也需要用到递归的编程技巧。 void * merge(int a[], int p, int q, int r) { int *tmp; int i, j, k; tmp = (int *)

t765833631的博客 258

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王。 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 之所以把归并排序、快速排序、希尔排序、堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn)。 请大家带着问题:快排和归并用的都是分治思想,递推公式和...

196

Android加密开发实战:Spongy Castle集成与国密算法应用指南

在移动应用开发中,数据加密是保障用户隐私和信息安全的基石。其原理基于密码学算法,通过对数据进行编码转换,确保即使数据被截获也无法被未授权方解读。这项技术的核心价值在于为敏感信息提供机密性、完整性和身份验证,广泛应用于用户登录、本地存储、网络通信等场景。对于Android开发者而言,系统自带的加密功能有时无法满足需求,特别是涉及国密算法或更丰富算法套件时。本文聚焦于Spongy Castle这一专为Android定制的加密库,它有效解决了与系统内置Bouncy Castle的兼容性问题,并提供了对SM4等国密

weixin_27722377的博客 308

Cadence Allegro通过手工绘制板框的方法

Cadence Allegro通过手工绘制板框的方法 Cadence Allegro绘制板框有三个方法: 1、通过手工绘制板框; 2、通过向导绘制板框; 3、通过导入DXF文件导绘制板框; 本章将教会大家如何通过手工的方法绘制100mm的矩形板框。 方法步骤如下: 一、通过放置绘图工具2D线绘制; 1、运行Cadence Allegro软件,打开File菜单栏,选择New。 2、这时软件会弹出Ne...

LGCPCB的博客 2万+

惊叹数据结构之美,品味排序算法之妙:对归并排序的详细介绍

归并排序(Merge Sort)是一种经典且高效的排序算法,它采用分治法策略来排序数据。下面从原理、递归实现以及非递归实现等多个角度详细介绍归并排序。

z15879084549的博客 1493

DBeaver连接IoTDB避坑指南:手动配置JDBC驱动的完整流程(附问题排查)

本文提供了在DBeaver中手动配置Apache IoTDB JDBC驱动的完整流程与避坑指南。详细解析了从驱动创建、库文件添加(关键是指向整个lib目录)到连接测试的每一步,并重点针对常见的ClassNotFoundException、连接拒绝等错误提供了深度排查方案,帮助用户高效建立图形化管理连接。

weixin_28327051的博客 396

希尔排序是一种稳定的排序算法_JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王。想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远。笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。之所以把归并排序、快速排序、希尔排序、堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn)。请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它...

weixin_39915204的博客 380

Palantir 产品架构深度解析:从本体到AI的决策智能平台

本文深度解析了Palantir决策智能平台的核心产品架构。其核心在于构建企业级的“本体”(Ontology),即业务世界的“数字孪生”,通过数据、逻辑、操作三层抽象统一语义。平台以此为基础,通过Foundry构建数字孪生,并通过AIP(人工智能平台)实现本体增强生成(OAG),将AI深度融入业务,形成从数据感知、智能分析到行动执行的完整决策闭环。

ooo22的博客 735

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

《数据结构与算法之美》读书笔记

这本书的大部分内容比较浅显,因此只挑DSAA课程上没有涉及或没有深入讨论的点总结。

SAKN701的博客 668

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6688

【排序算法】02:归并排序、快速排序

归并排序:从下到上;快速排序:从上到下

spencer011000110的博客 1196

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

改进归并排序算法

一、针对经典归并排序算法问题的改进措施 (1)针对递归层次问题 采用能在小规模集合上有效工作的其它算法,直接对小规模集合处理。 如INSERTIONSORT算法 (2)针对元素频繁移动问题 采用一个称为链接信息数组LINK(1:n)的数据结构,记录归并过程中A中的元素相对于其排序后在分类表中位置坐标的链接关系。 LINK(i)取值于[1,n],是指向A的元素的指针:在分类表中它指向下一个元素在A中的位置坐标。 二、具体实现 m_improved.h #pragma once //直接插入排序 void i

snoopy19981210的博客 3124

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

归并排序算法

本章介绍排序算法中的归并排序。内容包括: 1. 归并排序介绍 2. 归并排序图文说明 3. 归并排序的时间复杂度和稳定性 4. 归并排序实现 4.1 归并排序C实现 4.2 归并排序C++实现 4.3 归并排序Java实现转载请注明出处:归并排序 - 如果天空不死 - 博客园更多排序和算法请参考:数据结构与算法系列 目录将两个的有序数列合并成一个有序数列,我们称之为"归并"。 归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式

生活需要深度 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

用java实现归并排序算法

用java实现归并排序 一. 归并排序的思路 归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此类排序需要两个步骤:1.拆分原数组 2.合并子数组。因此此算法是经典的分治算法。 拆分算法的思路 利用递归,不断得寻找左子数组和右子数组,一直到数组的长度为一 合并算法的...

Mark的博客 1万+

常见排序算法之归并排序——归并排序

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

保护小周ღ的博客 2403

[算法沉淀记录] 排序算法 —— 归并排序

归并排序是一种分治算法,由约翰·冯·诺伊曼在1945年发明。它的工作原理是将未排序的列表划分为n个子列表,每个子列表包含一个元素(包含一个元素的列表被认为是有序的),然后重复合并子列表以生成新的有序子列表,直到只剩下一个子列表。 归并排序是一种高效的排序算法,其优缺点如下:总体而言,归并排序是一种高效的通用排序算法,特别适合需要稳定排序和大量数据的情况。然而,如果内存使用是一个关键因素,或者数据集非常小,可能需要考虑其他排序算法。归并排序是一种高效的通用排序算法,由于其稳定性和(O(n log n))的时间

莫寒技术人生 1640

【算法】之归并排序

太阳风暴 彗星袭月,白虹贯日,仓鹰击于殿上。

qq_41346335的博客 6229
上一篇: 《ASCE1885的网络编程》---IP数据报格式
下一篇: 《ASCE1885的网络编程》---地址解析协议
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值