数组合并问题

cheng20100915 2010-09-06 10:59:45
题:有2个数组如 int a[]={5,2,9,7,3,6,15},int b[]={2,5,7,9,11,1,16,,8};
要合并为一个数组,并且按照从小到大的顺序排列输出.

要求:用c语言,用简单最,最节省 内存 的方式.
...全文
411 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng20100915 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kyzy_yy_pm 的回复:]
如楼主说的,如果是需要考虑内存的话,估计我那个就不行了,因为在去除重复项后会余下多于的内存
[/Quote]
其实你这个挺好的,可以有余下的内存,只要不再占用更多的内容就好.
kyzy_yy_pm 2010-09-08
  • 打赏
  • 举报
回复
如楼主说的,如果是需要考虑内存的话,估计我那个就不行了,因为在去除重复项后会余下多于的内存
justplayit 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luping303 的回复:]
在各自数组中排序之后,再归并会不会比构成一个大数组之后再排序快?
[/Quote]

不好说,大数组最快是 nlogn ,假设 n=a+b, nlogn = alog(a+b) + blog(a+b) ;两个小数组各进行排序最快就是 aloga + blogb,归并最快也要 n 也就是 a+b , 那么分成两个小数组再归并最快是 aloga + a + blogb + b = alog2a + blog2b。 就是比较 alog(a+b) + blog(a+b) 和 alog2a + blog2b大小问题了,留待数学达人比较
kyzy_yy_pm 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kouji1990 的回复:]
引用 3 楼 kyzy_yy_pm 的回复:
初学C,什么也没考虑,献丑:

C/C++ code
#include <stdio.h>
//#include <string.h>
#include <malloc.h>

void main(){
int a[] = {5,2,9,7,3,6,15}, b[] = {2,5,7,9,11,1,16,8}, int_l = siz……
[/Quote]嘿嘿,初学者,初学者,忘了free()了
cheng20100915 2010-09-07
  • 打赏
  • 举报
回复
这题的做法,思路我都明白,关键是代码不够简单,而且要求内存问题.其中隐含条件是去除重复数据.所以说才麻烦了点
cheng20100915 2010-09-07
  • 打赏
  • 举报
回复
谢谢各位的支持,其实这是我以前在一家公司的笔试题,所以,我想,既然是笔试,那就要把代码写的最短,最简单
比较好
  • 打赏
  • 举报
回复
先2个小数组内部排序
再逐个插到一个vector中
zyywj1314 2010-09-07
  • 打赏
  • 举报
回复
学习了,学习
cheng20100915 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kyzy_yy_pm 的回复:]
初学C,什么也没考虑,献丑:

C/C++ code
#include <stdio.h>
//#include <string.h>
#include <malloc.h>

void main(){
int a[] = {5,2,9,7,3,6,15}, b[] = {2,5,7,9,11,1,16,8}, int_l = sizeof(int), al = sizeo……
[/Quote]
free();

这兄弟写的好,除了忘记释放内存,忘了最主要的一点,

既然是合并数组,自然就不能出现重复数据,否则就没意义了.

其实这题,关键在于去除重复数据,我也会做,我也做出来了,但是最终的代码写的太长了,有50行呢,

所以我才在这求一个简单的.
justplayit 2010-09-07
  • 打赏
  • 举报
回复
请个人算了下, alog(a+b) + blog(a+b) <= alog2a + blog2b
Thirty 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kyzy_yy_pm 的回复:]
思路:首先放到一个数组中,然后进行排序
[/Quote]
是的,最简单可行的方法
flysnowhite 2010-09-06
  • 打赏
  • 举报
回复
楼上的,程序效率太低了。
核心代码:
int c[15],n,i=0,j=0,k=0;
while (i<7 && j<8)
{
if (a[i]<=b[j])
{
c[k]=a[i];
i++;k++;
}
else
{
c[k]=b[j]:
j++;k++;
}
}
while (i<7)
{
c[k]=a[i];
i++;k++;
}
while (j<8)
{
c[k]=b[j]:
j++;k++;
}
luping303 2010-09-06
  • 打赏
  • 举报
回复
在各自数组中排序之后,再归并会不会比构成一个大数组之后再排序快?
kyzy_yy_pm 2010-09-06
  • 打赏
  • 举报
回复
初学C,什么也没考虑,献丑:
#include <stdio.h>
//#include <string.h>
#include <malloc.h>

void main(){
int a[] = {5,2,9,7,3,6,15}, b[] = {2,5,7,9,11,1,16,8}, int_l = sizeof(int), al = sizeof(a) / int_l, bl = sizeof(b) / int_l, l = al + bl, x, i, j, *arr = (int *)malloc(l * int_l);

for(i = 0; i < al; i++)*(arr + i) = a[i];
for(j = 0; j < bl; j++)*(arr + i + j) = b[j];
for(i = 0; i < al + bl; i++){
for(j = 0; j < i; j++){
if(*(arr + i) < *(arr + j)){
x = *(arr + i);
*(arr + i) = *(arr + j);
*(arr + j) = x;
}
}
}
for(i = 0; i < al + bl; i++)printf("%d ", *(arr + i));
}

hai040 2010-09-06
  • 打赏
  • 举报
回复
有没有distinct?
kyzy_yy_pm 2010-09-06
  • 打赏
  • 举报
回复
思路:首先放到一个数组中,然后进行排序
kouji1990 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kyzy_yy_pm 的回复:]
初学C,什么也没考虑,献丑:

C/C++ code
#include <stdio.h>
//#include <string.h>
#include <malloc.h>

void main(){
int a[] = {5,2,9,7,3,6,15}, b[] = {2,5,7,9,11,1,16,8}, int_l = sizeof(int), al = sizeo……
[/Quote]
写得挺好的,问一下啊动态内存是不是要释放啊free(arr)
lantianLM 2010-09-06
  • 打赏
  • 举报
回复
其实大家都已经做的很好了
luoqi 2010-09-06
  • 打赏
  • 举报
回复
ls的,这是伪代码,呵呵
a.length表示,这里要放a的长度,
qsort你要先学习一下,还有comp函数也要研究一下!
kyzy_yy_pm 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luoqi 的回复:]
int a[],b[],c[];
int i,j;
for(i=0;i<a.length;i++)c[i]=a[i];
for(j=0;j<b.length;j++)c[i+j]=b[j];

static int comp(int a,int b){return a-b;}
qsort(c,comp);

//done
[/Quote]不错,请问下qsort是不是c内置的,还有a.length是不是就能够得到数组的长度啊,谢谢,想学习c
加载更多回复(3)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧