当前位置:   article > 正文

超详解“二分法查找”,一看就会!

二分法查找

目录

一、 二分法概念用途

二、 超详思维图解

三、  超详使用方法实现代码运行操作

四、   总结

五、   结语

一:二分法概念用途

 什么是二分法?有什么作用?一般用在何处?

概念:二分查找法算法,也叫折半查找算法(对半处理会提高寻找目标数字的效率);

作用:在一串有序的数字中,能快速寻找到你输入的数字,是一种很高效的查询算法。注意!!使用二分查找要求数组数据必须采用顺序存储结构有序排列。

!!!接下来注意咯

二:使用思维

思维:首先找出这串有序数字的中间值,每次都跟区间的中间值进行对比,将查找的区间缩小成之前的一半,进行二次与中间值对比,再次将查找的区间缩小到之前的一半,直到找到你要查找的元素为止,是不是很简单呢?实质就一个这么简单的思维。

详细图解如下

 

三:使用方法实现代码运行操作

废话不多说上代码

1.定义变量

  1. int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
  2. int n = 0;
  3. int sz = sizeof(arr) / size(arr[0]);
  4. int left = 0;
  5. int right = sz - 1;

    int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };  用数组表示这组有序数字
    int n = 0;                                            定义即将寻找数数的变量
    int sz = sizeof(arr) / size(arr[0]);        元素的个数(  sz后面单独解释)
    int left = 0;                                         区间最左边的数字
    int right = sz - 1;                                区间最右边的数字

    int mid = (left + right) / 2;                   定义一个中间值,中间值=(最左边加最右边)÷ 2

    int  sz = sizeof(arr) / size(arr[0]);的单独解解释: 

!!sizeof  求空间大小用的

记公式!!! sizeof= 类型元素所占字节数  ×  元素个数

se是int 类型,一个元素占四个字节,那sizeof (arr) 内有11个元素,所以sizeof(arr)  共占44个字节

                                                                                                                                      4×11=44

                                                               sizeof(arr[ 0])内有一个元素,所以size(arr[0])共占4字节

                                                                                                                                       4×1=4

        所以 sz = sizeof(arr) / size(arr[0])=  44÷  4  =11;

2.

  1. while (left <= right)
  2. {
  3. if (arr[mid] > n)
  4. {
  5. right = mid - 1;
  6. }
  7. else if (arr[mid] < n)
  8. {
  9. left = mid + 1;
  10. }
  11. else
  12. {
  13. printf("找到了,下标是: %d\n", mid);
  14. break;
  15. }
  16. }
  17. if(left > right)
  18. printf("找不到!\n");

   if分支表达多种情况???

        中间值mid > 要查找的数,最右边的值right-1,缩小区间范围便于下一次查找

        中间值mid < 要查找的数,最左边的值left+1,缩小区间范围便于下一次查找

        中间值mid = 要查找的数,恭喜你,找到了!!

        if   (left > right)      (查找的数不在数组元素之内,就找不到)
            printf("找不到!\n");

while  循环语句???

       a.    因为查找不是一次就能找到,所以加个while 循环语句可以多查找几次,直到找到为止,                break直接跳出循环;

        b.    while语句的条件

                  while (left <= right),left本身是最左数,right本身是最右数,所以一般情况下left<right,中间值就存在。

还有一种情况就是·left=right=mid,最左值等于最右值也就是最后的中间值,此时恭喜你,已找到目标。

               if(left > right),  如果left>right,说明此元素不存在你的查找范围内,因此找不到。

3.    完整代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
  5. int n = 0;
  6. int sz = sizeof(arr) / size(arr[0]);
  7. int left = 0;
  8. int right = sz - 1;
  9. scanf("%d", &n);
  10. int mid = (left + right) / 2;
  11. while (left <= right)
  12. {
  13. if (arr[mid] > n)
  14. {
  15. right = mid - 1;
  16. }
  17. else if (arr[mid] < n)
  18. {
  19. left = mid + 1;
  20. }
  21. else
  22. {
  23. printf("找到了,下标是: %d\n", mid);
  24. break;
  25. }
  26. }
  27. if(left > right)
  28. printf("找不到!\n");
  29. return 0;
  30. }

4.   总结:二分法往简单里看就是三个步骤:

                                                                   1.    对半折

                                                                   2.     查找中间值( mid)

                                                                   3.     缩小区间(看与mid的关系再决定,往左+1或者往                                                                                                                                                  右-1)

5.   结语:

这是我第一次写博客,希望此文能够帮助到你,如有不足之处,望君留言。

如果本文对你有所帮助,记得点赞关注哟!笔者会持续更新干货,期待与君共勉!!

                                                                 

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

闽ICP备14008679号