手撕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

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

pandas批量拆分与合并Excel文件的实现示例

《pandas批量拆分与合并Excel文件的实现示例》本文介绍了Pandas中基于整数位置的iloc和基于标签的loc方法进行数据索引和切片的操作,并将大Excel文件拆分合并,具有一定的参考价值,感... 目录一、Pandas 进行索引和切编程片的iloc、loc方法二、Pandas批量拆分与合并Exce

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础