走过路过的大神,捎带看一眼选择算法的代码。acm报错runtime error。

__103__ 2014-10-28 11:30:16
在分治算法的分支里还有一个是选择算法。它是一种能够以O(n)时间选取数组的中值元素或任意的第K小元素的算法。基本思路是:在分治算法的递归调用的每一个划分步骤里,放弃一个固定部分的元素,对其余元素进行递归。于是,问题的规模便以几何级数递减如果第一次递归放弃处理1/3的元素,那么第二次递归时,只要处理原来的2/3的元素,在第三次递归时,只要处理原来的4/9的元素,如此等等。请根据此算法,解决以下问题。按递增顺序,以比较快的速度查找出N(N<=10000)个元素的第K小的元素。
代码如下:
#include<iostream>
using namespace std;
int nlist[10000];
int part(int l,int r){
int temp = nlist[l];
int i = l, j = r;
while (i < j)
{
while ( i < j && nlist[j] >= temp )
{
j--;
}
nlist[i] = nlist[j];
while ( i < j && nlist[i] <= temp)
{
i++;
}
nlist[j] = nlist[i];
}
nlist[i] = temp;
return i;
}
int selctsort(int key,int mid,int n)
{
if (key == nlist[mid])
{
return mid+1;
}
else if (key < nlist[mid])
{
selctsort(key,part(0,mid-1),n);
}
else{
selctsort(key,part(mid+1,n-1),n);
}
}
int main(){
int n,k;
int i;
cin >> n >> k;
for (i = 0; i < n;i ++)
{
cin >> nlist[i];
}
cout << selctsort(k,part(0,n-1),n-1) << endl;

return 0;
}
...全文
132 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2014-10-29
  • 打赏
  • 举报
回复
lz你还是先把快排搞懂再来做这个吧。问题不是一点半点的。 至于说栈空间简直笑喷。
赵4老师 2014-10-29
  • 打赏
  • 举报
回复
引用 2 楼 lovesmiles 的回复:
除了楼主说的 int nlist[10000]; 这是定义在栈空间的,有可能编译器不支持这么大,导致运行时栈溢出。
static int nlist[10000]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
brookmill 2014-10-29
  • 打赏
  • 举报
回复
selctsort的三个分支,两个都没有返回值? 这个算法我不懂,我猜可能应该是 else if (key < nlist[mid]) { return selctsort(key,part(0,mid-1),n); } else{ return selctsort(key,part(mid+1,n-1),n); }
勤奋的小游侠 2014-10-29
  • 打赏
  • 举报
回复
除了楼主说的 int nlist[10000]; 这是定义在栈空间的,有可能编译器不支持这么大,导致运行时栈溢出。
__103__ 2014-10-29
  • 打赏
  • 举报
回复
引用 6 楼 FancyMouse 的回复:
[quote=引用 5 楼 u010435367 的回复:] [quote=引用 4 楼 FancyMouse 的回复:] lz你还是先把快排搞懂再来做这个吧。问题不是一点半点的。 至于说栈空间简直笑喷。
这个算法只需要快排的一部分……[/quote] 看你这代码我真怀疑你能不能把快排写对。快排都写不对写这个太早了。[/quote] 你想的太多了。
FancyMouse 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 u010435367 的回复:
[quote=引用 4 楼 FancyMouse 的回复:] lz你还是先把快排搞懂再来做这个吧。问题不是一点半点的。 至于说栈空间简直笑喷。
这个算法只需要快排的一部分……[/quote] 看你这代码我真怀疑你能不能把快排写对。快排都写不对写这个太早了。
__103__ 2014-10-29
  • 打赏
  • 举报
回复
引用 4 楼 FancyMouse 的回复:
lz你还是先把快排搞懂再来做这个吧。问题不是一点半点的。 至于说栈空间简直笑喷。
这个算法只需要快排的一部分……

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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