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;
}