LeetCode-88合并两个有效数组

原题目链接:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)

一,排序 

最最简单的思路也是最最容易想到的办法,就是把nums2数组中的内容全部追加到nums1中去,然后进行顺序排序,但是这样效率不高。

题主还没有学快排,只会用qsort函数去排

int cmp(int* a, int* b) {
    return *a - *b;
}

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i < n; i++) 
    {
        nums1[m + i] = nums2[i];
    }
    qsort(nums1, m+n, sizeof(int), cmp);
}

二,归并排序

         原理是开辟一块新的空间,大小和nums1一致,运用两个指针从前向后递推,碰到小的就放到新开辟的空间里面去,缺点是耗费空间较大

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
	int move1 = 0, move2 = 0, end = 0;
	int*ret=malloc((m + n) * sizeof(int));
	while (move1<m&&move2<n)
	{
		if (nums1[move1] <= nums2[move2])
		{
			ret[end++] = nums1[move1++];
		}
		else
		{
			ret[end++] = nums2[move2++];
		}
	}
	if (move1 == m)
	{
		for (; move2 < n; move2++)
		{
			ret[end++] = nums2[move2];
		}
	}
	if (move2 == n)
	{
		for (; move1 < m; move1++)
		{
			ret[end++] = nums1[move1];
		}
	}
	for (int i = 0; i < m + n; i++)
	{
		nums1[i] = ret[i];
	}
}

三,归并排序变种

         在第二种方法的基础上,我们不禁要想,是不是有更简单的办法,可以直接在nums1数组中直接改,于是我们可以发现,如果以判断谁更大,从后往前放的话,刚好可以实现

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    //两数组取大的从后往前放
   int end1=m-1,end2=n-1;
   int end=m+n-1;
   while(end1>=0&&end2>=0)
   {
       if(nums1[end1]>=nums2[end2])
       {
           nums1[end]=nums1[end1];
           --end1;
           --end;
       }
       else
       {
           nums1[end]=nums2[end2];
           --end2;
           --end;
       }
   }
   for(int i=0;i<=end2;i++)
   {
       nums1[i]=nums2[i];
   }
}

(我现在都不知道这个nums1Size和nums2Size是干嘛的) 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值