手撕C语言题典——合并两个有序数组(顺序表)

2024-05-09 23:44

本文主要是介绍手撕C语言题典——合并两个有序数组(顺序表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言 

一.思路

1)排序算法

2)双指针

二.代码实现


搭配食用更佳哦~~

数据结构之顺顺顺——顺序表-CSDN博客

数据结构之顺序表的基本操作-CSDN博客

继续来做一下关于顺序表的经典算法题叭~

前言 

88. 合并两个有序数组 - 力扣(LeetCode)

       合并数组也是力扣上关于顺序表的一道简单题,继续来加深一下对顺序表的理解,当然大家也可以先去力扣上自己 try 一下~

一.思路

我们依旧先来看看题目讲的是啥 ,创建两个数组 nums1,nums2,注意题干中写出了:nums1 应该包含有 nums2 数组元素的空间,于是我们得到了下面两个数组:

我们需要把 nums2 合并到 nums1 中,并以非递减顺序排列,说人话就是递增顺序排序。

1)排序算法

       通过题干我们不难想到冒泡排序,让无序数组变成有序。于是这个思路就理清了,我们直接将 nums2 中的数据放入 nums1 中,再对 nums1 用排序算法进行排序。

       在此之前我们只学了冒泡排序,需要用到 for 循环的嵌套,但需要注意的是借助效率低下的排序算法会导致整体运行效率降低,但我们可以借助其他效率高的排序算法来做,因为今天的题主要是针对顺序表,所以这个思路就不展开。 

2)双指针

       我们还是定义两个变量 src1,src2,分别去遍历两个数组,并对数据进行比较,当 src1>src2 遍历的数据时,将 src2 遍历的数据存入数组 nums1 中,但此时我们会发现一个问题,当我们把数据存入数组1的时候,数组1此时的数据会被传入的数据覆盖。

此时 nums1 中的数据被覆盖

       我们发现从前往后遍历比较数据会有数据被覆盖的情况出现,所以这种方法不可取了。于是我们反过来,既然从头开始不行,那我们就从后往前遍历比较数据来看看,此时注意,比较大小时,谁大谁放在后面。此时我们需要添加一个变量 src3 来遍历 nums1 中没有数据的数组空间,src1 遍历存在有数据的最后一位。

      我们依旧比对 src1 和 src2,src2 > src1,我们就将此时 src1 的数据给给我们的 src3,然后src2 - -,src3 - -,依次遍历:

       当 src2 遍历到 2 的时候,src1> src2 ,我们就将 src1 指向的数据传给 src3 ,src1 - -,src3 - -,依次遍历,最终得到如下:

     再次进行 src2--,src3-- 此时 src2 跳出循环,循环终止我们就完成了两个数组的遍历,并把 nums2 合并到了 nums1 中且以非递减顺序排列。 

     当然我们要考虑所有情况,比如 src2 未遍历完,src1便已经跳出循环,此时不能跳出循环,而要继续去比较 src2 和 src3 的大小并排序:

        当继续比较遍历之后,src3- -,src2- - 跳出循环后,就可以终止循环了。

二.代码实现

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int 11 = m - 1;int 12 = n - 1;int 13 = m + n - 1;while (11 >= 0 && 12 >= 0)//只要一个条件为假就跳出循环{if(nums1[11] < nums2[12]) {nums1[13--] = nums2[12--];}else {nums1[13--] = nums1[11--];}}//除了循环有两种情况:11 >= 0 或者 12 >= 0//只需要处理一种情况:12 >= 0(12中的数据还没遍历完)while (12 >= 0){nums1[13--] = nums2[12--];}//此时num1中包含了nums2中的数据,nums1是升序数组
}

      至此,顺序表相关的两道题就更完啦~~       

    🎈🎈完结撒花🎈🎈  

这篇关于手撕C语言题典——合并两个有序数组(顺序表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974823

相关文章

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.