搭配食用更佳哦~~
数据结构之顺顺顺——顺序表-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此时的数据会被传入的数据覆盖。
我们发现从前往后遍历比较数据会有数据被覆盖的情况出现,所以这种方法不可取了。于是我们反过来,既然从头开始不行,那我们就从后往前遍历比较数据来看看,此时注意,比较大小时,谁大谁放在后面。此时我们需要添加一个变量 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是升序数组
}
至此,顺序表相关的两道题就更完啦~~
🎈🎈完结撒花🎈🎈