HDU 1007题目求救 老是Runtime Error (STACK_OVERFLOW)

guo1105094218 2014-01-18 10:54:14
附代码:求大神赐教 貌似递归写的不好 估计20的规模就会崩 无语了
#include<stdio.h>
#include<math.h>
#define SIZE 100100

typedef struct cor_x_y{
double cor_x[SIZE];
double cor_y[SIZE];
}cor;

cor xy;
int q,w;

void swap(double *a,double *b){
double s;
q=a-xy.cor_x;
w=b-xy.cor_x;
s=xy.cor_x[q];
xy.cor_x[q]=xy.cor_x[w];
xy.cor_x[w]=s;
s=xy.cor_y[q];
xy.cor_y[q]=xy.cor_y[w];
xy.cor_y[w]=s;
}

double *split (double *head , double *tail)
{
double middle = *(head + (tail - head) / 2);
while (1)
{
while (*head < middle)
head++;
tail--;
while (*tail > middle)
tail--;
if (head >= tail)
return head;
swap (head , tail);
head++;
}
}
//快速排序 , 递归调用
void QuickSort(double * first , double *last)
{
if (last > first+1)
{
double *t=split(first, last);
if (last -t < t - first)
{
QuickSort(t, last);
QuickSort(first , t);
}
else
{
QuickSort(first , t);
QuickSort(t, last);
}
}
}

double div_meg(cor xy,int i,int j){
int mid=(int)(i+j)/2;
double m,mm,b;
if(i>=j){
return -1;
}
m=div_meg(xy,i,mid);
mm=div_meg(xy,mid+1,j);
b=(xy.cor_x[mid]-xy.cor_x[mid+1])*(xy.cor_x[mid]-xy.cor_x[mid+1])+(xy.cor_y[mid]-xy.cor_y[mid+1])*(xy.cor_y[mid]-xy.cor_y[mid+1]);
if(m<0&&mm>=0){
if(mm>b)
return b;
else
return mm;
}
if(m>=0&&mm<0){
if(m>b)
return b;
else
return m;
}
if(m<0&&mm<0){
return b;
}
if(m>=0&&mm>=0){
if(mm>b){
if(b>m){
return m;
}else{
return b;
}
}else{
if(m>mm){
return mm;
}else{
return m;
}
}
}
}
int main(){
int n,i;
scanf("%d",&n);
while(n){
for(i=0;i<n;i++){
scanf("%lf",&xy.cor_x[i]);
scanf("%lf",&xy.cor_y[i]);
}
QuickSort(xy.cor_x,xy.cor_x+n);
printf("%.2lf\n",sqrt(div_meg(xy,0,n-1))/2);
scanf("%d",&n);
}
return 0;
}
...全文
222 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guo1105094218 2014-01-19
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
while (*head < middle) head++; tail--; while (*tail > middle) tail--; 你确定这里不会越界?
不会的 快排没有问题哦 是最近点的问题
guo1105094218 2014-01-19
  • 打赏
  • 举报
回复
引用 2 楼 logiciel 的回复:
为避免程序崩溃,建议不要把全局变量xy传递到函数div_meg中,改为直接操作xy: double div_meg(int i,int j){ //double div_meg(cor xy,int i,int j){ int mid=(int)(i+j)/2; double m,mm,b; if(i>=j){ return -1; } m=div_meg(i,mid);//m=div_meg(xy,i,mid); mm=div_meg(mid+1,j);//mm=div_meg(xy,mid+1,j); 另外,LZ程序没有对y座标排序.以下是一个反例: 3 1 5 1 1 1 7
谢谢了 没有崩溃了 但是为什么就超时了呀。。。无语了
guo1105094218 2014-01-19
  • 打赏
  • 举报
回复
引用 楼主 guo1105094218 的回复:
附代码:求大神赐教 貌似递归写的不好 估计20的规模就会崩 无语了 #include<stdio.h> #include<math.h> #define SIZE 100100 typedef struct cor_x_y{ double cor_x[SIZE]; double cor_y[SIZE]; }cor; cor xy; int q,w; void swap(double *a,double *b){ double s; q=a-xy.cor_x; w=b-xy.cor_x; s=xy.cor_x[q]; xy.cor_x[q]=xy.cor_x[w]; xy.cor_x[w]=s; s=xy.cor_y[q]; xy.cor_y[q]=xy.cor_y[w]; xy.cor_y[w]=s; } double *split (double *head , double *tail) { double middle = *(head + (tail - head) / 2); while (1) { while (*head < middle) head++; tail--; while (*tail > middle) tail--; if (head >= tail) return head; swap (head , tail); head++; } } //快速排序 , 递归调用 void QuickSort(double * first , double *last) { if (last > first+1) { double *t=split(first, last); if (last -t < t - first) { QuickSort(t, last); QuickSort(first , t); } else { QuickSort(first , t); QuickSort(t, last); } } } double div_meg(cor xy,int i,int j){ int mid=(int)(i+j)/2; double m,mm,b; if(i>=j){ return -1; } m=div_meg(xy,i,mid); mm=div_meg(xy,mid+1,j); b=(xy.cor_x[mid]-xy.cor_x[mid+1])*(xy.cor_x[mid]-xy.cor_x[mid+1])+(xy.cor_y[mid]-xy.cor_y[mid+1])*(xy.cor_y[mid]-xy.cor_y[mid+1]); if(m<0&&mm>=0){ if(mm>b) return b; else return mm; } if(m>=0&&mm<0){ if(m>b) return b; else return m; } if(m<0&&mm<0){ return b; } if(m>=0&&mm>=0){ if(mm>b){ if(b>m){ return m; }else{ return b; } }else{ if(m>mm){ return mm; }else{ return m; } } } } int main(){ int n,i; scanf("%d",&n); while(n){ for(i=0;i<n;i++){ scanf("%lf",&xy.cor_x[i]); scanf("%lf",&xy.cor_y[i]); } QuickSort(xy.cor_x,xy.cor_x+n); printf("%.2lf\n",sqrt(div_meg(xy,0,n-1))/2); scanf("%d",&n); } return 0; }
不是 快排的问题 是随后的找最近点的问题
logiciel 2014-01-19
  • 打赏
  • 举报
回复
为避免程序崩溃,建议不要把全局变量xy传递到函数div_meg中,改为直接操作xy: double div_meg(int i,int j){ //double div_meg(cor xy,int i,int j){ int mid=(int)(i+j)/2; double m,mm,b; if(i>=j){ return -1; } m=div_meg(i,mid);//m=div_meg(xy,i,mid); mm=div_meg(mid+1,j);//mm=div_meg(xy,mid+1,j); 另外,LZ程序没有对y座标排序.以下是一个反例: 3 1 5 1 1 1 7
FancyMouse 2014-01-19
  • 打赏
  • 举报
回复
while (*head < middle) head++; tail--; while (*tail > middle) tail--; 你确定这里不会越界?

69,381

社区成员

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

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