面试算法 合并两个有序数组

1.题目:合并两个有序数组

两个有序整数数组  nums1和  nums2,将 nums2合并到 nums1中,使 nums1成为一个有序数组。
初始化nums1和nums2的元素数量分别为m和n。假设nums1的空间大小等于m+n,这样它就有足够的空间保存来自nums2的元素。


2.算法:

1.暴力算法
2.双指针算法 

3.通过双指针算法从后往前进行遍历,无需将arr在初始数组暂存到额外的数组中,这是对方法2的改进


3.算法思想  (看代码!!)

暴力算法,
1.把数组 2   加到 数组 1 的后面 
2.使用 sort  快排 

双指针算法 (看代码!!)

建立两个指针,一个指向数组1  的下标, 一个指向 数组二的 下标
生成一个新的数组存放排序好的数组

算法3 (看代码!!)

通过双指针算法从后往前进行遍历,无需将arr在初始数组暂存到额外的数组中,这是对方法2的改进


4.代码:

/*************************************************
作者:She001
时间:2022/8/28
题目:合并两个有序数组
两个有序整数数组  nums1和  nums2,将 nums2合并到 nums1中,使 nums1成为一个有序数组。
初始化nums1和nums2的元素数量分别为m和n。假设nums1的空间大小等于m+n,这样它就有足够的空间保存来自nums2的元素。

1.暴力算法
2.双指针算法 
3.通过双指针算法从后往前进行遍历,无需将arr在初始数组暂存到额外的数组中,这是对方法2的改进

***************************************************/
#include<bits/stdc++.h>
using namespace std;

//暴力算法,
/*
算法思想:
1.把数组 2   加到 数组 1 的后面 
2.使用 sort  快排 
*/ 

int * fangfa_1(int n1[],int n2[],const int m1,const int m2)//n1 数组1  n2 数组2   m1 n1的数量  , m2 n2的数量
{
	int *nn=new int[m1+m2];
	for(int i=0;i<m1;++i)
	{
		nn[i]=n1[i];	
	}	//把 n1 写入数组
	for(int i=m1,j=0;i<m1+m2;++i,++j)
	{
		nn[i]=n2[j];
	}  
	sort(nn,nn+m1+m2);
	return nn;
} 



//双指针算法
/*
算法思想:
建立两个指针,一个指向数组1  的下标, 一个指向 数组二的 下标
生成一个新的数组存放排序好的数组
*/ 

int * fangfa_2(int n1[],int n2[],const int m1,const int m2)
{
	int *nn=new int[m1+m2];
	int p1=0;
	int p2=0;
	int p=0;
	while(p1<m1 && p2<m2)
	{
		nn[p++]=n1[p1]<n2[p2] ? n1[p1++] :n2[p2++];//三目运算符,后加加 
	}
	//把没有加进去的 ,放入数组,
	//他们只有一个会发生
	//他们是有序的
	while(p1<m1)
	{
		nn[p++]=n1[p1++];
	}
	while(p2<m2)
	{
		nn[p++]=n2[p2++];
	}
	return nn;
	 
}


void  fangfa_3(int n1[],int n2[],const int m1,const int m2)
{
	//这里我们需要 运用n1 的空间 所以 n1 要大
	int p1=m1-1;
	int p2=m2-1;
	int p=m1+m2-1; 
	while(p1>=0 && p2>=0)
	{
		n1[p--]=n1[p1]>n2[p2]? n1[p1--] : n2[p2--];
		//cout<<"p1= "<<p1<<"  "<<"p2= "<<p2<<"   ";
		//cout<<"p = "<<p+1<<"   ";
		//cout<<n1[p+1]<<endl;
	}
	//假如是 p2<0  n1剩下的是有序的 不要排列了
	//假如是 p1<0  p1 对应的数据都排列完了  只要排列p2 的数据了。 
	
	
	while(p1>=0)
	{
		n1[p--]=n1[p1--];
		//cout<<"p3 = "<<p+1<<"   ";
		//cout<<n1[p+1]<<endl;
	}
	
	while(p2>=0)
	{
		n1[p--]=n2[p2--];
		//cout<<"p3 = "<<p+1<<"   ";
		//cout<<n1[p+1]<<endl;
	}
	
	
	for(int i=0;i<m1+m2;i++)
	{
		cout<<n1[i]<<"  ";
	}
	 
}

int main()
{
	int n1[10]={1,3,4,6,8,9,13,14,45,96};
	int n2[8]={1,3,6,7,8,9,10,46};
	int *gg=fangfa_1(n1,n2,10,8);
	for(int i=0;i<18;i++)
	{
		cout<<gg[i]<<"  ";
	}
	cout<<endl<<endl;
	int *ww=fangfa_2(n1,n2,10,8);
	for(int i=0;i<18;i++)
	{
		cout<<ww[i]<<"  ";
	}
	
	cout<<endl<<endl;
	int n3[18]= {1,3,4,6,8,9,13,14,45,96};
	fangfa_3(n3,n2,10,8);//局部变量传不回来 ,不在这里显示 
	
	delete[] ww; 
	delete[] gg;
	
	 
	
	  
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值