归并排序【C语言版-笔记】

news2024/11/28 13:34:40

目录

  • 一、概念
  • 二、排序流程理解
  • 三、代码实现
    • 3.1主调函数
    • 3.2 merge函数
  • 四、性能分析

一、概念

归并是一种算法思想,是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素,可以把n个元素看作n个有序表,把它们两两合并得到 ⌈ n / 2 ⌉ 个 \lceil n/2\rceil个 n/2长度为2或1(n为奇数时)的有序表,继续重复两两合并的操作,直到剩下一个有序表,即得到最终排序的结构,这是“二路归并排序”,还有多路的归并。

二、排序流程理解

给定一个序列如下:
在这里插入图片描述

1)不断地将当前序列平均分割成2个子序列,直到不能再分割(序列中只剩1个元素)
2)不断地将2个子序列合并成一个有序序列,直到最终只剩下1个有序序列
在这里插入图片描述
要点分析:
① 处理好边界和有序表分割位置选择问题
② 合并两个子序列的过程中,如何排序使合并后的序列是一个有序序列,称之为:merge

1、有序表分割的位置(排序使用到的参数:begin,mid,end)
初始时:
begin=0,mid=(begin+end)/2,end=length
规定:
左边表范围:[begin,mid)
右边表范围:[mid,end)
当无序表元素个数为偶数时,划分的左右子表元素个数相同,
当无序表元素个数为奇数时,划分的左右子表元素个数相差1,右子表多个一
不管奇偶情况如何,左子表元素个数为:mid-begin,右子表元素个数为:end-mid

2、merge过程中我们使用一个辅助数组leftArray,把位于[begin,end)
  范围的表中左边部分[begin,mid)之间的元素拷贝到leftArray中,用
  leftArray表中元素和右边部分元素依次比较,小的放入原表(即:[begin,end) )中的左边部分,
  直到leftArray或右边部分的元素比较完,然后把剩余的没比较的直接拷贝到原表中即可,一次merge完成。

在这里插入图片描述

◼ li == 0,le == mid – begin
◼ ri == mid,re == end

三、代码实现

3.1主调函数

void sort(int *nums,int begin,int end){
	if(end-begin<=1) return;//只有一个元素不用排序
	int mid=(begin+end)/2;//或(begin+end)>>1
	sort(nums,begin,mid);
	sort(nums,mid.begin);
	merge(nums,begin,mid,end);
}

3.2 merge函数

void merge(int *nums,int begin,int mid,int end){
	int li=0;
	int le=mid-begin;
	int ri=mid;
	int re=end;
	int ai=begin;
	int leftArray=(int*)malloc(le*sizeof(int));//辅助数组
	//初始化辅助数组
	for(int i=li;i<le;i++){
		leftArray[i]=nums[begin+i];//begin~end之间左边部分拷贝到夫leftArray
	}
	//在原存储空间上给两个有序子表重新排序(逻辑上是合并为一个有序表),两种可能:左边指针先走完(ri>=re)或右边指针先走完。
	//若左边先走完则直接把leftArray中li指针指向的及之后的元素复制到原存储空间(nums);若右边先走完,则结束
	while(li<le){
		if(ri<re&&nums[ri]<leftArray[li]){
			nums[ai++]=nums[ri++];//拷贝左边部分的元素到nums[ai]
		}else{
			nums[ai++]=leftArray[li++];//拷贝右边部分的元素到nums[ai]
		}
	}
}

四、性能分析

空间效率: merge函数中使用的辅助空间是n/2个单元,即算法的空间复杂度:O(n)
时间效率: 每趟归并的时间复杂度是O(n),总共需要进行 ⌈ l o g 2 n ⌉ \lceil log_2n\rceil log2n趟归并,总的时间复杂度:O(nlog2n)
稳定性: 不会改变相同关键字记录的相对次序(看merge函数中while循环的处理部分可知),因此二路归并排序是稳定的排序算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中数据转换以及字符串的“+”操作

隐式转换&#xff08;自动类型转换&#xff09; 较小范围的数据类型转成较大范围的数据类型 强制转换&#xff08;显式转换&#xff09; 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型&#xff08;如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程&#xff0c;代码共享&#xff0c;不作写入操作时&#xff0c;数据也是共享的&#xff0c;当任意一方试图写入&#xff0c;便通过写时拷…

影刀RPA实战:excel相关图片操作指令解

1.实战目标 excel是工作中必不缺少的工具&#xff0c;今天我们继续使用影刀RPA来实现excel操作的便利性&#xff0c;让影刀自动化来帮我们完成工作。 2.单元格填充图片 2.1 指令说明 功能&#xff1a;向 Excel 单元格插入本地图片或网络图片&#xff0c;支持Office和WPS&…

波阻抗,是电场矢量的模值/磁场矢量的模值

波阻抗是电场复振幅除以磁场复振幅&#xff0c;最后只与介质με有关 所以磁场可用电场强度表示&#xff08;利用波阻抗&#xff09; 问题&#xff0c;复振幅是矢量&#xff0c;波阻抗的定义是复振幅的比值&#xff1f;答案&#xff1a;不是&#xff0c;很明显&#xff0c;波阻…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态&#xff1a; Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时&#xff0c;从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

Pikachu-Sql Inject-搜索型注入

MySQL的搜索语句&#xff1a; select * from table where column like %text%&#xff1b; 如&#xff1a;使用引号闭合左边的引号&#xff0c; or 11 把所有数据查询出来&#xff1b; # 注释掉后面的 引号等&#xff1b; test or 11# 查询出结果&#xff1a; 注入的核心点…

Cloneable接口(浅拷贝和深拷贝的区别)

前言 Object类中存在这一个clone方法&#xff0c;调用这个方法可以创建一个对象的“拷贝”。但是想要合法调用clone方法&#xff0c;必须要先实现Clonable接口&#xff0c;否则就会抛出CloneNotSupportedException异常。 1 Cloneable接口 //Cloneable接口声明 public interf…

CentOS 7文件系统

从centos7开始&#xff0c;默认的文件系统从ext4变成了XFS。随着虚拟化的应用越来越广泛&#xff0c;作为虚拟化磁盘来源的大文件&#xff08;单个文件几GB级别&#xff09;越来越常见。 1.XFS组成部分&#xff1a; XFS文件系统在数据的分布上主要划分为三部分&#xff1a;数据…

QT篇:QT介绍

一.QT概述 Qt 是一个跨平台的应用程序和用户界面框架&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序以及命令行工 具。它最初由挪威的 Trolltech &#xff08;奇趣科技&#xff09;公司开发&#xff0c;现在由 Qt Company 维护&#xff0c;2020年12月8…

如何在网格中模拟腐烂扩散:如何使用广度优先搜索(BFS)解题

问题描述 你需要在一个二维的网格中处理橘子的腐烂扩散过程&#xff0c;网格中的每个单元格可以有三种状态&#xff1a; 0&#xff1a;表示空格&#xff0c;没有橘子。1&#xff1a;表示一个新鲜的橘子。2&#xff1a;表示一个腐烂的橘子&#xff0c;它可以在 1 分钟内让上下…

模拟算法(1)_替换所有的问号

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(1)_替换所有的问号 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. …

MHA携手Atlas:打造高效读写分离解决方案,引领数据库性能飞跃

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

npm切换到淘宝镜像

1、输入以下命令后回车&#xff0c;npm切换至淘宝镜像 npm config set registry https://registry.npmmirror.com 2、输入以下命令后回车&#xff0c;检查是否切换成功 npm config get registry 若返回此信息&#xff0c;表示切换成功 3、切换后就可使用淘宝镜像加快npm包的…

C语言 | Leetcode C语言题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; int cmpfunc(const void *a, const void *b) {return (*(int *)a - *(int *)b); } //计算组合数*2 int every(int count) {if (count 1) {return 0;} else {return count * (count - 1);} } //计算每个锚点能产生的回旋镖总数 int part(in…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍&#xff08;12&#xff09;正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…

4M-21: An Any-to-Any Vision Model for Tens of Tasks and Modalities论文精度

贡献&#xff1a;在21种高度不同的模态中训练一个统一的模型&#xff0c;并且对比专有模型不会有性能损失做法&#xff1a;将不同模态映射到不同的token空间&#xff0c;并且可以生成不同的模态token【Any-to-any】关键点&#xff1a;如何在不同的模态中应用tokenization进行映…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景&#xff1a; 2.字符串函数 字符串函数使用场景&#xff1a; 3.数学函数 4.控制流函数 1.日期函数 函数示例&#xff1a; 1.在日期的基础上加日期 在该日期下&#xff0c;加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量&#xff0c;可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域&#xff1a; 对于每个会话都会生效当前会话&#xff1a;只…

通信工程学习:什么是SNMP简单网络管理协议

SNMP&#xff1a;简单网络管理协议 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种用于在计算机网络中管理网络节点&#xff08;如服务器、工作站、路由器、交换机等&#xff09;的标准协议。它属于OSI模型的应用层&#…

TIM的PWM模式

定时器的工作流程: 定时器对时钟传来的脉冲次数计数&#xff0c;并且在次数到达范围值时触发中断。如向下计数模式时为0&#xff0c;向上计数为达到自动重装载计时器的值时触发中断。 STM32里面的定时器有多个定时器。 如TIM1、TIM2、TIM3 定时器的输入捕获模式来测量输…