求教:合并算法问题

bcloud 2003-07-26 09:34:29
设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1)。试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法。要求算法在最坏情况下所用的计算时间为O(n),且只用到O(1)的辅助空间。
Thank u.
...全文
35 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueSky2008 2003-07-27
  • 打赏
  • 举报
回复
sorry,二路并归排序也要用O(n)的空间,再想想。如果是对链表排序的话,好像就可以了。
bcloud 2003-07-26
  • 打赏
  • 举报
回复
你说的方法,只能符合计算时间为O(n),但题目对空间的要求没有满足,题中要求合并到a[0:n-1]中
BlueSky2008 2003-07-26
  • 打赏
  • 举报
回复
二路并归排序。
zzwu 2003-07-26
  • 打赏
  • 举报
回复
这是外排序,确实可以非常快.

外排序算法思想如下:
1.为了方便,把你的a[k+1]开始的数组改称b[0]数组;
2.为a[0],b[0]设2个指针, pa=0; pb=0;
3.比较a[pa],b[pb],小的输出,对应指针+1
4.重复3,直到一个指针到数组底;
5.将另一个数组的剩下元素全部输出.
zzwu 2003-07-26
  • 打赏
  • 举报
回复
抱歉,没有注意到O(1)辅助空间的要求.要从新考虑.
one_add_one 2003-07-26
  • 打赏
  • 举报
回复
感觉这个题目无解。。。我想了两年了。。
bcloud 2003-07-26
  • 打赏
  • 举报
回复
谢谢各位的回复,这个题感觉不容易,这个题出自21世纪系列教材《计算机算法设计与分析》,第二章,第12个习题,大家再帮忙动动脑筋啦。
IT_worker 2003-07-26
  • 打赏
  • 举报
回复
不好意思,上面程序完全错误。
我感觉楼主的问题好像是个陷阱,感觉非常容易,实际上很困难,我看来是做不出来了。
IT_worker 2003-07-26
  • 打赏
  • 举报
回复
void sort(int *F,int *M,int *L){
for(;F!=M; ++F)
if(*F>*M) swap(*F,*M);
}
上面的函数中F相当于楼主的a,M相当于a+k+1,L相当于a+n。函数仅仅再swap的时候用到一个辅助空间
ZhangYv 2003-07-26
  • 打赏
  • 举报
回复
二路并归排序
levinjoe 2003-07-26
  • 打赏
  • 举报
回复
sorry,上面代码是错的,我再想一下!
levinjoe 2003-07-26
  • 打赏
  • 举报
回复
zzwu说的是让你更容易理解!
int pa=0,pb=k+1;
while((pa<k+1)&&(pb<n))
{
if(LE(a[pa],a[pb])==true)
pa++;
else
{
temp=a[pa]; //0(1)空间
a[pa]=a[pb];
a[pb]=temp;
pb++;
}
}

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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