顺序表经典算法练习

合并两个有序数组

在线oj:. - 力扣(LeetCode)

题目描述

拿到题目后经分析,就是将两个递增数组(nums1,nums2)的内容存按升序存放到nums1数组中。

我们首先会想到的方法是:冒泡排序(冒泡排序不会的客户以先去了解一下冒泡排序)。

就是把nums2中的数据存放到nums1中,在进行冒泡排序。

代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//先把num2中的数据存放到nums1中
int l1=m;//nums1中最后的位置
int j=0;//遍历nums2中的数据
for(int i=m;i<nums1Size;i++){
nums1[i]=nums2[j];
j++;
}
//进行冒泡排序
for(int i=0;i<m+n-1;i++){
    for(int k=0;k<m+n-1-i;k++){
        if(nums1[k]>nums1[k+1]){
            int tem=nums1[k];
            nums1[k]=nums1[k+1];
            nums1[k+1]=tem;
        }
    }
}
}

案例通过

但学过复杂度的肯定在想,毕竟两成for循环时间复杂度太大,所以我们接下来利用一种简便方法。

非常棒的方法:(三指针算法)

我们可以把num2中数据放到num1数组的同时直接进行排序,这样就方便的多,具体分析方法如下:

分析一:

如图所示,我们可以定义两个指针 l1,l2,让l1与l2对应的数据比较,如果l1小于l2时让l1++,让下一个继续与l2比较,如果l1>l2就把l2对应的数据赋值给l1,这样看来是很好的,但问题是你把num1原有的数据覆盖了。所以我们换种思路,从后面比较。

分析二:

如图所示,我们可以定义三个指针变量,位置分别如上。

我们可以通过循环从后往前比较,谁大谁放后边。

比如上述案例:l1<l2 , 把l2值赋值给l3, l2--,l3--,变成如下结果

   

继续循环操作一样,循环结束条件1:

当l2<0时循环结束

循环结束条件2:

如果两数组情况如下所示

则需把num2中的数据循环放入l1中

所有情况分析完,上代码

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int l1=m-1;
    int l2=n-1;
    int l3=m+n-1;
    while(l1>=0 && l2>=0){
        if(nums1[l1]<nums2[l2]){
            nums1[l3]=nums2[l2];
            l3--;
            l2--;
        }else{
            nums1[l3]=nums1[l1];
            l3--;
            l1--;
        }
    }
    while(l2>=0){
        nums1[l3]=nums2[l2];
        l3--;
        l2--;
    }
}

案例通过

总结:

以上算法采用了三指针法,时数据结构中常用的算法。您看完文章,如果有哪些不合理的地方请一定私信小编,这是小编写下去的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值