两个有序数组(升序)合并、去重,最后得到有序数组,时间复杂度O(n)

#include <stdio.h>
#include <string.h>
#include <malloc.h>


//功能:合并有序数组arrayB到数组arrayA中,对新的数组arrayA去重,排序
//参数:数组arrayA,长度为lm;数组arrayB,长度为ln
//
//时间复杂度要求:O(n)
//讨论升序合并求解:
//
/*
0、arrayA的容量t=lm+ln
1、arrayA和arrayB都是升序排列
2、int i=ln-1,j=lm-1,t=lm+ln-1; 
arrayA: 2,3,5,6,19,39,56,88,100,112,116,130,160,200,270,288  ....-> t-1,t
arrayB: 1,2,4,7,9,22,57,88,97,107,113,120,300,300,599
loop1: 
当i>=0且j>=0时:
用arrayB[i]和arrayA[j]比较:
如果i>0且arrayB[i - 1] == arrayB[i]则i--跳过元素i
如果j>0且arrayA[j - 1] == arrayA[j]则j--跳过元素j
如果arrayB[i]大于arrayA[j]
将arrayB[i]存入arrayA[t],i--
如果arrayB[i]小于arrayA[j]
将arrayA[j]存入arrayA[t],j--,arrayA[j]=0
如果arrayB[i]等于arrayA[j]
将arrayA[j]存入arrayA[t],i--,j--,arrayA[j]=0


当i>=0且j>0时:
备份arrayA[t + 1]为temp
当arrayB[i]大于arrayA[t + 1]
arrayA[t + 1] = arrayB[i];
arrayA[t] = temp;
.....


当i>0且j>=0时:
....


t--;
goto  loop1;
*/
int mergeArray(int* arrayA, int lm, int* arrayB, int ln)
{
int i = 0, j = 0, t = 0, temp = 0;


if (0 == ln)  return lm;
if (0 == lm && ln > 0)  {
for (i = 0; i < ln; i++)
arrayA[i] = arrayB[i];
return lm;
}
for (i = ln - 1, j = lm - 1, t = lm + ln - 1; i >= 0 || j >= 0; t--){


if (j >= 0 && i >= 0)
{
if (arrayB[i] > arrayA[j]){
arrayA[t] = arrayB[i];
i--;
}
else{
arrayA[t] = arrayA[j];
arrayA[j] = 0;
j--;
}
}
else if (j < 0 && i >= 0)
{
temp = arrayA[t + 1];
if (arrayB[i] > arrayA[t + 1])
{
arrayA[t + 1] = arrayB[i];
arrayA[t] = temp;
}
else arrayA[t] = arrayB[i];
i--;
}
else if (j >= 0 && i < 0)
{
temp = arrayA[t + 1];
if (arrayA[j] > arrayA[t + 1])
{
arrayA[t + 1] = arrayA[j];
arrayA[t] = temp;
}
else arrayA[t] = arrayA[j];
j--;
}
}
t++;
return t;
}
int mergeArrayNoRepeat(int* arrayA, int lm, int* arrayB, int ln)
{
int i = 0, j = 0, t = 0, temp = 0;


if (0 == ln)  return lm;
if (0 == lm && ln > 0)  {
for (i = 0; i < ln; i++)
arrayA[i] = arrayB[i];
return lm;
}
for (i = ln - 1, j = lm - 1, t = lm + ln - 1; i >= 0 || j >= 0; t--){
if (j >= 0 && i >= 0)
{
if (i > 0 && arrayB[i - 1] == arrayB[i])
i--;


if (j > 0 && arrayA[j - 1] == arrayA[j]){
arrayA[j] = 0;
j--;
}


if (arrayB[i] > arrayA[j]){
arrayA[t] = arrayB[i];
i--;
}
else if (arrayB[i] < arrayA[j]){
arrayA[t] = arrayA[j];
arrayA[j] = 0;
j--;
}
else
{
arrayA[t] = arrayA[j];
arrayA[j] = 0;
j--;
i--;
}
}
else if (j < 0 && i >= 0)
{
temp = arrayA[t + 1];
if (arrayB[i] > arrayA[t + 1]){
arrayA[t + 1] = arrayB[i];
arrayA[t] = temp;
}
else if (arrayB[i] < arrayA[t + 1])
arrayA[t] = arrayB[i];
else
t++;


i--;
}
else if (j >= 0 && i < 0)
{
temp = arrayA[t + 1];
if (arrayA[j] > arrayA[t + 1]){
arrayA[t + 1] = arrayA[j];
arrayA[t] = temp;
}
else if (arrayA[j] < arrayA[t + 1])
arrayA[t] = arrayA[j];
else
t++;
j--;
}
}
t++;
return t;

}


#define N1 16
#define N2 15
#define N (N1+N2)


int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;

int arrayA[N] = { 2, 3, 5, 10, 19, 39, 56, 88, 100, 112, 116, 130, 160, 200, 270, 288 };//16
int arrayB[N2] = { 1, 3, 9, 22, 57, 88, 97, 107, 113, 120, 300, 300, 301,400,599 };

int ret = 0;
int y = 0;
//ret = mergeArray(arrayA, N1, arrayB, N2);
ret = mergeArrayNoRepeat(arrayA, N1, arrayB, N2);
for (i = ret; i < N; i++)
{
printf("%d ", arrayA[i]);
y++;
}
//printf("\n\n");
//int ret2 = 0;
//ret2 = delRepeatNumber(arrayA, y+1);
//for (i = 0; i < ret2; i++)
//{
// printf("%d ", arrayA[i]);
//}


getchar();

return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值