二分查找中的堆栈溢出错误

今天在调试一个二分查找的程序时出现了STACK OVERFLOW错误,原因是对一个未进行排序的数组进行二分查找,由于二分查找的过程是基于分治算法的,所以涉及到堆栈的频繁调用,所以这是今天发生错误的主要原因。但是还有一个,就是退出条件的判断有问题,这个问题使得如果找不到目标的话就无限递归,并最终导致堆栈溢出,溢出时step值是35575,也就是调用35575次后导致堆栈溢出,由此可见给分配的堆栈空间貌似不是很大哦~~这个判断错误大家自己看吧,虽然错误比较低级........而且qsort用的也有问题,后来修改后比较函数里int y=(int)(*b);后来改正了。一句又报出非法的间接寻址错误...qsort第一次用,还是不熟练啊!最终还是搞定了,哈哈,高兴啊!!
程序贴出来,千疮百孔,漏洞百出@#@
--2010-1-21--
 

Code:
  1. #include<stdio.h>   
  2. #include<math.h>   
  3. #include<stdlib.h>   
  4. #define M 10000   
  5. #define FLAG 1   
  6. int search(int *src,int dst,int beg,int end);   
  7. int intcmp(const void *a,const void *b){   
  8.  int *x,*y;   
  9.  x=a;   
  10.  y=b;   
  11.  if(*x>*y)   
  12.  {   
  13.   return 1;   
  14.  }   
  15.  else if(*x==*y)   
  16.  {   
  17.   return 0;   
  18.  }   
  19.  else  
  20.  return -1;   
  21. }   
  22. static int step=0;   
  23. extern void divcon(){    
  24.  int src[M];   
  25.  void *tran;   
  26.  register int lop;   
  27.  for(lop=0;lop<M;lop++)   
  28.  {   
  29.   src[lop]=rand()%10000;   
  30.  }   
  31.  tran=(void*)src;   
  32.  qsort(tran,M,sizeof(int),intcmp);   
  33.  printf("%d s %d",step,search(src,src[1800],0,M-1));   
  34. }   
  35. int search(int *src,int dst,int beg,int end)   
  36. {   
  37.  int tem=(beg+end)/2;   
  38.  step++;   
  39.  if(beg>end)   
  40.  {   
  41.   return 0;   
  42.  }   
  43. else  
  44. {   
  45.  if(src[tem]==dst)   
  46.  {   
  47.   return tem;   
  48.  }   
  49.  if(src[tem]>dst)   
  50.  {   
  51.   return search(src,dst,beg,tem);   
  52.  }   
  53.  else  
  54.  {   
  55.   return search(src,dst,tem+1,end);   
  56.  }   
  57. }   
  58. }   
  59. //--修改后程序...   
  60. #include<stdio.h>   
  61. #include<math.h>   
  62. #include<stdlib.h>   
  63. #define M 10000   
  64. int search(int *src,int dst,int beg,int end);   
  65. static int step=0;   
  66. int intcmp(const void *a,const void *b);   
  67. void divcon(){    
  68.  int src[M];   
  69.  register int lop;   
  70.  for(lop=0;lop<M;lop++)   
  71.  {   
  72.   src[lop]=rand()%10000;   
  73.  }   
  74.  qsort((void*)src,M,sizeof(int),intcmp);   
  75.  printf("%d s %d",step,search(src,src[1800],0,M-1));   
  76. }   
  77. int search(int *src,int dst,int beg,int end)   
  78. {   
  79.  int tem=(beg+end)/2;   
  80.  step++;   
  81.  if(beg>end)   
  82.  {   
  83.   return 0;   
  84.  }   
  85. else  
  86. {   
  87.  if(src[tem]==dst)   
  88.  {   
  89.   return tem;   
  90.  }   
  91.  if(src[tem]>dst)   
  92.  {   
  93.   return search(src,dst,beg,tem-1);   
  94.  }   
  95.  else  
  96.  {   
  97.   return search(src,dst,tem+1,end);   
  98.  }   
  99. }   
  100. }   
  101. int intcmp(const void *a,const void *b){   
  102.  int *x,*y;   
  103.  x=(int*)a;   
  104.  y=(int*)b;   
  105.  if(*x>*y)   
  106.  {   
  107.   return 1;   
  108.  }   
  109.  else if(*x==*y)   
  110.  {   
  111.   return 0;   
  112.  }   
  113.  else  
  114.  return -1;   
  115. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值