社区
C语言
帖子详情
高手进!!有道难题!!!
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分!!!
...全文
140
12
打赏
收藏
高手进!!有道难题!!!
有道难题: 设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1).试设计一个合并这两个子数组 为排好序的数组a[0:n-1]的算法。要求算法在最坏情况下所用的计算时间为O(n),且只用到O(1)的辅助空间。 给程序或算法均可!!给40分!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
好 看我的~
自学
有道
-产品经理需要的工具视频教程
自学,需要一种方法,让学习变成一件简单的事儿;产品经理的工具,思维导图又叫脑图,能够帮助产品经理
进
行用户角色以及功能结构梳理等等的工作;而且还可以提高工作效率的同时形成系统的学习和思维的习惯;...
看
有道
难题
比赛有恶心感 ,付源码挑战,博客园目前纯速度最快。
编码比赛,感觉是武林大会一样本来很高兴不过后来发现主要要装jre?罢了6-1后看园子里各位兄弟都在做题目,看了以后感觉非常难过,恶心!...他们当中能出几个汇编级
高手
?的确,我不否认算法的重...
有道
难题
之eaglet的算法
有道
难题
之eaglet的算法 刚才在园子里看到 周利华关于 "
有道
难题
"的两道题的算法,eaglet 做了一下,第一题比周利华的算法快10倍左右,第二天快100倍左右。由于eaglet不符合参赛条件,所以就在博客园和大家交流交流...
2010网易
有道
难题
练习赛-C-求解答
这题没想到高效的解法。求解答。 菲波那切数列可以用下列的式子表示: f(1)=1 f(2)=1 f(n)=f(n-1)+f(n-2) (n>=3) 现在我们根据这个规则定义另一种数列 ...看来还是C++圈子的算法
高手
多,基本比赛的都是C++人士。
"
有道
难题
2009"复赛题目
突然发现,
有道
难题
也有编程比赛,先看了一下去年的题目,自己写了一个方法,再与官方给出的方法相比较,下面我对我的方法和官方方法作一下比较,找出不足,
进
步
进
步 。首先列出题目: Problem Statement: ...
C语言
69,374
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章