【每日一题】合并两个有序数组

链接奉上:合并两个有序数组
在这里插入图片描述

直接合并后排序:

思路:

将nums2直接合并到nums1后边,并进行排序

代码实现:

#include<stdlib.h>

int cmp(void* e1,void* e2)
{
    return *((int*)e1)-*((int*)e2);
}

void merge(int* nums1,int numsSize1, int m,int* nums2, int numsSize2,int n)
{
    int j = 0;
    for(int i = m; i < numsSize1;i++)
    {
        nums1[i] = nums2[j++];
    }
    qsort(nums1,numsSize1,4,cmp);
}

双指针

思路:

我们发现nums1nums2已经是排序了的。
为了利用这一性质,我们可以使用双指针方法。
这一方法将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。

代码实现:

初版:

void merge(int* nums1,int numsSize1, int m,int* nums2, int numsSize2,int n)
{
    int arr[numsSize1];
    int count1 = 0;
    int count2 = 0;
    int i = 0;
    if(n < 1)
    //若n<1,进行判断时会发生越界现象
    ;
    else
    {
        while(1)
        {   
        //当count1+count2相加等于numssize1说明数组arr已经装满了
        //就可以跳出循环
            if(count1 + count2 == numsSize1)
            {
                break;
            }
            //这两个goto语句是为了防止nums1超出m时后会判断失误
            //或者nums2超出n时越界
            if(count1 == m)
            goto flag2;
            if(count2 == n)
            goto flag1;
            if(nums1[count1] <= nums2[count2])
            {
                flag1:
                arr[i++] = nums1[count1++];
            }
            else
            {
                flag2:
                arr[i++] = nums2[count2++];
            }
        }
        for(int i = 0; i < numsSize1; i++)
        {
            nums1[i] = arr[i];
        }
    }
}

进阶版:
我们发现初版的代码包含了goto语句,逻辑判断也比较令人摸不到头脑
于是

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
	int p1 = 0, p2 = 0;
	int sorted[m + n];
	int cur;
	while (p1 < m || p2 < n) {
		if (p1 == m) {
			cur = nums2[p2++];
		}
		else if (p2 == n) {
			cur = nums1[p1++];
		}
		else if (nums1[p1] < nums2[p2]) {
			cur = nums1[p1++];
		}
		else {
			cur = nums2[p2++];
		}
		sorted[p1 + p2 - 1] = cur;
	}
	for (int i = 0; i != m + n; ++i) {
		nums1[i] = sorted[i];
	}
}

这段代码业务逻辑就更加清晰,我们也要学习这样的代码风格,

欢迎讨论。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值