原题目链接: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是干嘛的)