解决寻找两个正序数组中位数问题:C语言实现与解析

在算法学习和实际编程应用中,处理数组相关的问题是很常见的。其中,寻找两个正序数组的中位数就是一个经典的题目,不仅考验对数组操作的熟悉程度,还涉及到对算法效率的考量。今天,我们就来深入探讨如何使用C语言解决这一问题。

一、题目描述

给定两个大小分别为  m  和  n  的正序(从小到大)数组  nums1  和  nums2  ,要求找出并返回这两个正序数组的中位数。并且,算法的时间复杂度应该为  O(log (m + n))  。例如:

- 输入:nums1 = [1,3] , nums2 = [2]  ,输出: 2.000000  ,因为合并数组  = [1,2,3]  ,中位数是  2  。

- 输入: nums1 = [1,2] , nums2 = [3,4]  ,输出: 2.500000  ,因为合并数组  = [1,2,3,4]  ,中位数是  (2 + 3) / 2 = 2.5  。

二、解题思路

要解决这个问题,最直接的方法是先将两个数组合并成一个新的有序数组,然后根据新数组的长度是奇数还是偶数来计算中位数。具体步骤如下:

计算合并后数组的大小:

将两个数组的长度相加,得到合并后数组的总长度  n  。

分配内存并合并数组:

使用  malloc  函数动态分配一块足够大的内存空间来存储合并后的数组。然后,通过  memcpy  函数 nums1  和  nums2  的元素依次复制到新数组中。

对合并后的数组进行排序:

调用C标准库中的  qsort  函数对合并后的数组进行排序。 qsort  函数需要一个比较函数,这里我们定义了  cmp_int  函数来指定整数的比较规则。

计算中位数:

根据合并后数组的长度  n  的奇偶性来计算中位数。如果  n  是偶数,中位数是中间两个元素的平均值;如果  n  是奇数,中位数就是中间的那个元素。

释放内存:

使用完动态分配的内存后,通过  free  函数将其释放,以避免内存泄漏。

三、代码实现


 

c#include <stdio.h>#include <stdlib.h>#include <string.h>// 比较函数,用于qsort排序int cmp_int(const void*e1,const void*e2) {return *(int*)e1 - *(int*)e2;}// 寻找两个正序数组中位数的函数double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {// 计算合并后数组的大小int n = nums1Size + nums2Size;// 动态分配内存存储合并后的数组int *ps = (int*)malloc(sizeof(int) * (nums1Size + nums2Size));if (ps == NULL) {// 内存分配失败处理return 0.0; }// 将nums1的元素复制到新数组memcpy(ps, nums1, nums1Size * sizeof(int));// 将nums2的元素复制到新数组memcpy(ps + nums1Size, nums2, nums2Size * sizeof(int));// 对合并后的数组进行排序qsort(ps, n, sizeof(int), cmp_int);double temp;if (n % 2 == 0) {// 数组长度为偶数时计算中位数temp = (ps[n/2 - 1] + ps[n/2]) / 2.0;} else {// 数组长度为奇数时计算中位数temp = ps[n/2];}// 释放动态分配的内存free(ps);return temp;}

四、代码解析

比较函数  cmp_int :

该函数是为  qsort  函数定制的比较规则。它接受两个指向  void  类型的指针  e1  和  e2  ,在函数内部将它们强制转换为指向  int  类型的指针,然后返回两个整数的差值。 qsort  函数会根据这个差值来决定元素的排序顺序。

主函数  findMedianSortedArrays :

- 内存分配与检查:使用  malloc  分配内存给  ps  指针指向的数组。如果分配失败( ps  为  NULL ),直接返回  0.0  ,并在实际应用中可以进一步添加错误提示信息。

- 数组合并:

通过两次  memcpy  函数调用,分别将  nums1  和  nums2  的内容复制到新数组  ps  中。

- 数组排序:

调用  qsort  函数,传入合并后的数组  ps  、数组长度  n  、每个元素的大小  sizeof(int)  以及比较函数  cmp_int  ,完成排序操作。

- 中位数计算:

根据  n  的奇偶性,分别计算并存储中位数到  temp  变量中。

- 内存释放:

使用  free  函数释放之前动态分配的内存,确保程序不会出现内存泄漏问题。

五、时间复杂度分析

当前实现中,合并数组的操作时间复杂度为  O(m + n)  ,排序操作使用了  qsort  ,其平均时间复杂度为  O((m + n) log (m + n))  。虽然这个实现满足了功能需求,但时间复杂度并没有达到题目要求的  O(log (m + n))  。要达到题目要求的时间复杂度,可以使用二分查找的思路,通过划分两个数组的左右部分,利用中位数的性质来优化算法,不过这就需要更复杂的逻辑和代码实现。

六、总结

通过对寻找两个正序数组中位数这一问题的分析和C语言实现,我们熟悉了数组的基本操作、内存管理以及排序函数的使用。同时,也了解到当前实现与题目最优时间复杂度要求的差距。这启示我们在解决算法问题时,不仅要关注功能的实现,还要不断思考如何优化算法以提高效率。希望这篇博客能对大家理解和解决类似问题有所帮助。

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

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

相关文章

【二分答案 C/C++】洛谷P1182 数列分段 Section II

2025 - 03 - 02 - 第 66 篇 Author: 郑龙浩 / 仟濹 【二分搜索/二分答案】 文章目录 洛谷P1182 数列分段 Section II题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示思路1 每段和的最大值最小 什么意思&#xff1f;&#xff1f;2 大体思路代码 洛谷P1182 数…

vue3项目中使用Arco Design的Table表格组件expandable展开行属性结合h()函数生成表格嵌套表格效果

文章目录 需求实现方式方式一方式二 操作父元素时默认收起当前展开行 需求 vue3项目中使用Arco Design - Table结合 vue3-h()函数实现表格嵌套表格的效果 实现方式 方式一 1、给Table组件设置表格的“展开行配置”参数&#xff1a;expandable <a-table :expandable&quo…

pytorch 模型测试

在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…

VirtualBox虚拟机转VM虚拟机

前言&#xff1a;部分靶机只适用于VirtualBox&#xff0c;VM打不开VirtualBox的文件&#xff0c;所以需要进行转换 前置条件&#xff1a;本机已经下载VM和VirtualBox 第一步&#xff1a;文件转换 找到VirtualBox.exe所在位置&#xff0c;启动cmd窗口 文件转换的命令&#xf…

【零基础C语言】第四节 数组

【零基础C语言系列】 【零基础C语言】第一节 C语言概述【数制进制码制】-CSDN博客 【零基础C语言】第二节 数据类型、运算符、表达式-CSDN博客 【零基础C语言】第三节 控制结构-CSDN博客 一、一维数组

DeepSeek API使用及私有化部署

DeepSeek 大模型概述 DeepSeek 是一款参数量高达 671B 的大语言模型&#xff0c;其模型参数文件规模庞大&#xff0c;即使是经过优化的版本&#xff0c;参数文件也有数十 GB。这种庞大的参数量赋予了 DeepSeek 强大的自然语言处理能力&#xff0c;使其能够处理复杂的语言任务&…

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

目录 一、典型案例&#xff1a;系统发布后的GC雪崩事件 &#xff08;一&#xff09;故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征&#xff1a;Allocation Failure &#xff08;二&#xff09;问题定位 二、原理深度解析&#xff1a;JVM内存弹…

IDEA 使用codeGPT+deepseek

一、环境准备 1、IDEA 版本要求 安装之前确保 IDEA 处于 2023.x 及以上的较新版本。 2、Python 环境 安装 Python 3.8 或更高版本 为了确保 DeepSeek 助手能够顺利运行&#xff0c;您需要在操作系统中预先配置 Python 环境。具体来说&#xff0c;您需要安装 Python 3.8 或更高…

C++(蓝桥杯常考点)

前言&#xff1a;这个是针对于蓝桥杯竞赛常考的C内容&#xff0c;容器这些等下棋期再讲 C 在DEVC中注释和取消注释的方法&#xff1a;ctrl/ ASCII值&#xff08;常用的&#xff09;&#xff1a; A-Z:65-90 a-z:97-122 0-9:48-57 换行/n:10科学计数法&#xff1a;eg&#xff1a…

vue These dependencies were not found

These dependencies were not found: * vxe-table in ./src/main.js * vxe-table/lib/style.css in ./src/main.js To install them, you can run: npm install --save vxe-table vxe-table/lib/style.css 解决&#xff1a; nodejs执行以下语句 npm install --save vxe-t…

【三.大模型实战应用篇】【4.智能学员辅导系统:docx转PDF的自动化流程】

去年团队庆功宴上,我司CTO端着酒杯过来:“老王啊,咱们现在文档解析做得挺溜了,但老师们总抱怨下载的作业格式乱码…” 我看了眼手机里凌晨三点收到的崩溃警报,把杯里的可乐一饮而尽——得,新的副本又开了。 一、为什么PDF转换比想象中难十倍? 某次用户调研中,数学教研…

安卓基础组件Looper - 03 java层面的剖析

文章目录 workflow工作线程 准备Looper创建LooperActivity主线程其他情况 Looper.prepare()大体流程java申请Loopernew LooperMessageQueue初始化 nativejniNativeMessageQueue Looper.loop()大体流程java获取Looper获取msg&#xff0c;处理msgLooper.loop()Looper.loopOnce &a…

docker关闭mysql端口映射的使用

需求 项目中的数据库为mysql&#xff0c;如果将端口映射到宿主机上&#xff0c;容易被工具扫描出&#xff0c;且随着国产化的进程推进&#xff0c;mysql将不被允许。为了提高安全性与满足项目需求&#xff0c;这里采用隐藏mysql端口方式&#xff0c;不映射宿主机端口&#xff…

fps项目总结:动画蓝图

文章目录 状态不同状态的并存性。 状态 不同状态的并存性。

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…

Mybatis-Plus 配合Sharding-JDBC 实现分库分表

在现代数据库设计中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库往往无法满足高并发、高性能的业务需求。因此&#xff0c;分库分表策略成为数据库架构优化的重要手段。本文将介绍分库分表的基本概念&#xff0c;并重点探讨垂直拆分与水平拆分的区别&#xff0c;以…

3.1、密码学基础

目录 密码学概念与法律密码安全分析密码体制分类 - 私钥密码/对称密码体制密码体制分类 - 公钥密码/非对称密码体制密码体制分类 - 混合密码体制 密码学概念与法律 密码学主要是由密码编码以及密码分析两个部分组成&#xff0c;密码编码就是加密&#xff0c;密码分析就是把我们…

同一个问题对比

问题&#xff1a;如何看torch 和torchvision版本&#xff0c;如何看CUDA的版本&#xff0c;我是ubuntu的系统。 chat复制粘贴很好用。 一、chat 在 Ubuntu 下&#xff0c;你可以使用以下命令来检查 Torch&#xff08;PyTorch&#xff09;、Torchvision 以及 CUDA 版本信息。 …

Unity 对象池技术

介绍 是什么&#xff1f; 在开始时初始化若干对象&#xff0c;将它们存到对象池中。需要使用的时候从对象池中取出&#xff0c;使用完后重新放回对象池中。 优点 可以避免频繁创建和销毁对象带来性能消耗。 适用场景 如果需要对某种对象进行频繁创建和销毁时&#xff0c;例…