当前位置:   article > 正文

二分查找的递归与非递归_治算法——二分查找法 递归 非递归

治算法——二分查找法 递归 非递归

之前写过二分查找的代码,但一直没有总结。今天就先总结一下二分查找的递归与非递归的实现。


一、关于二分查找的算法

1.二分查找的条件:必须是一组有序的数据(升序或降序)

2.二分查找也称折半查找,其算法就是(以一组升序的数据来解释):

a.每次先找出这组数据的中间数(mid);

b.如果要查找的数据(num)小于 mid ,那么就在前一半数据中查找;如果要查找的数据(num)大于 mid ,那么就在后一半数据中查找;

c.继续重复上述步骤,直到找到为止,此时返回数据的位置;找不到返回空。很明显,这样就大大提高了查找的效率

可以用这幅图简单来表示一下:


举个例子:例如要在数组a={1,2,3,4,5,6,7,8,9}中查找 2 这个数,那么就要先找出中间数 5 ,由于 2<5 ,那么应该在该数据的前一半(1~5)查找,然后继续重复上述工作...


二、代码实现

非递归:

  1. //非递归
  2. int bin_search(int *arr,int sz,int num)
  3. {
  4. assert(arr);
  5. int left = 0;<span style="white-space:pre"> //每段数据的左端</span>
  6. int right = sz-1;<span style="white-space:pre"> //每段数据的</span>右<span style="white-space:pre">端</span>
  7. int mid = 0;
  8. while (left <= right)
  9. {
  10. mid = (left+right)/2; //中间位置每次都在变
  11. if (num == *(arr+mid))
  12. {
  13. return mid;
  14. }
  15. else if (num < *(arr+mid))
  16. {
  17. right = mid - 1;
  18. }
  19. else
  20. {
  21. left = mid + 1;
  22. }
  23. }
  24. if(left > right)
  25. return NULL;
  26. else
  27. return mid;
  28. }
递归:

  1. //递归
  2. int bin_search(int* arr, int left, int right, int num)
  3. {
  4. assert(arr);
  5. int mid = 0;
  6. while (left <= right)
  7. {
  8. mid = (left + right)/2;
  9. if (num == *(arr+mid))
  10. {
  11. return mid;
  12. }
  13. else if (num < *(arr+mid))
  14. {
  15. return(bin_search(arr,left,mid,num));
  16. }
  17. else
  18. {
  19. return(bin_search(arr,mid,right,num));
  20. }
  21. }
  22. return NULL;
  23. }






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/896646
推荐阅读
相关标签
  

闽ICP备14008679号