user-0 提问: HDU 1007题目求救 老是Runtime Error (STACK_OVERFLOW)

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:while (*head  <  middle)             head++;       tail--;        while (*tail  >  middle)             tail--;  你确定这里不会越界？ 不会的  快排没有问题哦  是最近点的问题

user: user-0
content: 引用 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 谢谢了 没有崩溃了 但是为什么就超时了呀。。。无语了

user: user-0
content: 引用 楼主 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; } 不是 快排的问题 是随后的找最近点的问题

user: user-1
content: 为避免程序崩溃,建议不要把全局变量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

user: user-2
content: while (*head  <  middle)             head++;       tail--;        while (*tail  >  middle)             tail--;  你确定这里不会越界？