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

发布于:2024-05-03 ⋅ 阅读:(22) ⋅ 点赞:(0)

搭配食用更佳哦~~

数据结构之顺顺顺——顺序表-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是升序数组
}

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

    🎈🎈完结撒花🎈🎈