高手进!!有道难题!!!

sober1982 2003-10-18 04:19:15
有道难题:
设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1).试设计一个合并这两个子数组
为排好序的数组a[0:n-1]的算法。要求算法在最坏情况下所用的计算时间为O(n),且只用到O(1)的辅助空间。

给程序或算法均可!!给40分!!!
...全文
136 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoyang 2003-10-19
  • 打赏
  • 举报
回复
#include <string.h>
void link(int *a,int *b)
{ int *p,*q;
int i,j;
for (i=0,j=0;i<strlen(a)&&b;i++)
if (*(a+i)<*(b+j)) *(a)=(*b);
else i++,j++;
*(a)=*(b);
return a;
}
hcj2002 2003-10-19
  • 打赏
  • 举报
回复
一个归并算法,清华的数据结构书上有。
fangjinhuo 2003-10-19
  • 打赏
  • 举报
回复
#include <stdio.h>

#define N 6

void main()
{
int a[N]={3,4,2,6,8,10},k=2,*a1,*a2,t,m,temp,i=0,p=0;
a1=a;
a2=&(a[k]);
while(a2>=a1&&i<=N)
{
t=*a1;
while( t>*a2 && ( a2<=( a+N-1 ) ) )
{
temp=*a1;*a1=*a2;*a2=temp;
a1++;a2++;p++;i++;
}
if(a1==a+k) {m=*a2;p=0;}
else { a2=a2-p;m=*a2;p=0;}
while(m>=*a1) {a1++;i++;}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
}
试一试,每次改N and k,含义与题中一样
splover 2003-10-18
  • 打赏
  • 举报
回复
up
jiajia1982 2003-10-18
  • 打赏
  • 举报
回复
试试交换下~
Darkay_Lee 2003-10-18
  • 打赏
  • 举报
回复
是不是最好写好了,调试好了,写个简单的思路说明,然后发到你老师的作业信箱呢!
oyd 2003-10-18
  • 打赏
  • 举报
回复
如果不用模板,那段函数其实就是这样

int* merge(
int* _F1,//first
int* _L1,//last
int* _F2,
int* _L2,
int* _X) //out
{for (; _F1 != _L1 && _F2 != _L2; ++_X)
if (*_F2 < *_F1)
*_X = *_F2++;
else
*_X = *_F1++;
return (copy(_F2, _L2, copy(_F1, _L1, _X))); }
而copy函数是这样的
int* copy(int* _F, int* _L, int* _X)
{for (; _F != _L; ++_X, ++_F)
*_X = *_F;
return (_X); }
使用的时候呢
extern a[N];
extern k;
int main()
{
int b[N];
merge(a,a+k,a+k+1,N-1,b);
}
不过不符合你的O(1)的空间要求。
sober1982 2003-10-18
  • 打赏
  • 举报
回复
大哥 给点说明啊 小弟看不懂啊!!!
最好用c编!!!
熊主任 2003-10-18
  • 打赏
  • 举报
回复
我觉得思路是一定要避免一个个比较,因为2个数组都已经排序完毕,应该可以一段段做。
比如在a0中a[i],a[i+1],在a1中找到最大的一个段满足比a[i]大,比a[i+1]小,一次插入。辅助空间有O(1)就够了。
oyd 2003-10-18
  • 打赏
  • 举报
回复
template<class _II1, class _II2, class _OI> inline
_OI merge(
_II1 _F1,//first
_II1 _L1,//last
_II2 _F2,
_II2 _L2,
_OI _X) //out
{for (; _F1 != _L1 && _F2 != _L2; ++_X)
if (*_F2 < *_F1)
*_X = *_F2++;
else
*_X = *_F1++;
return (copy(_F2, _L2, copy(_F1, _L1, _X))); }
oyd 2003-10-18
  • 打赏
  • 举报
回复
c++标准库中的有源代码啦。
sober1982 2003-10-18
  • 打赏
  • 举报
回复
好 看我的~

69,371

社区成员

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

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