两个已知升序数列合并成一个新升序数列并去重
我的想法是利用第三个数组来存放两个数组的元素,然u后排序,最后再去重。但是结果显然错误的,没有显示b数组的元素
请大家帮我看一下,谢谢!
int merge(int n,int a[],int m,int b[]){
int c[100],i,j;
//合并
for(i=0;i<n;i++){c[i]=a[i];}
for(i=n;i<n+m;i++){c[i]=b[i-n];}
//排序
int temp;//中间变量
for(i=0;i<n+m;i++){
for(j=0;j<n+m;j++){
if(c[j]>c[j+1]){
temp=c[j+1];
c[j+1]=c[j];
c[j]=c[j+1];
}
}
}
//去重
for(i=0;i<n+m;i++){
if(a[i]==a[i+1]){
for(j=i;a[j];j++)a[j]=a[j+1];
}
}
//输出新数组
for(int k=0;k<n+m;k++){cout<<c[k]<<" ";}
return 0;
}
void main(){
int a[10]={1,2,3,4,5,6,8,18,19,23};
int b[10]={5,6,7,11,13,16,18,19,20,21};
merge(10,a,10,b);
cout<<endl;
system("pause");
}
改了一下代码,参考如下:
#include<iostream>
#include<string>
using namespace std;
int merge(int n,int a[],int m,int b[]){
int c[100],i,j;
int d[1000] = {0}; // 检测重复数字
//合并
int size = 0;
for(i=0;i<n;i++)
{
if (d[a[i]] == 1)
continue;
c[size++]=a[i];
d[a[i]] = 1;
}
for(i=n;i<n+m;i++)
{
if (d[b[i-n]] == 1)
continue;
c[size++]=b[i-n];
d[b[i-n]] = 1;
}
//排序
int temp,noswap;
for(i=0;i< size-1; i++)
{
noswap=1;
for(j=size-1;j>i;j--)
if(c[j-1]>c[j])
{
temp=c[j-1];
c[j-1]=c[j];
c[j]=temp;
noswap=0;
}
if(noswap)
break;
}
//去重
// for(i=1;i<n+m;i++){
// if(c[i]==c[i-1]){
// for(j=i;j<n+m;j++)
// c[j-1]=c[j];
// }
// }
//输出新数组
for(int k=0;k<size;k++){cout<<c[k]<<" ";}
return 0;
}
int main(){
int a[10]={1,2,3,4,5,6,8,18,19,23};
int b[10]={5,6,7,11,13,16,18,19,20,21};
merge(10,a,10,b);
cout<<endl;
system("pause");
}
如有帮助,欢迎采纳哈!