• 二分查找 binarySearch 适合初学分析的例子


    递归代码:

    1. #include <cstdio>
    2. #include <algorithm>
    3. #define MAX 5
    4. using namespace std;
    5. int binarySearch(int x,int a[],int left,int right);
    6. int main()
    7. {
    8. int a[MAX]={1,3,4,5,9};
    9. printf("find %d location is %d\n",4,binarySearch(4,a,0,MAX-1));
    10. printf("find %d location is %d\n",11,binarySearch(11,a,0,MAX-1));
    11. printf("find %d location is %d\n",9,binarySearch(9,a,0,MAX-1));
    12. return 0;
    13. }
    14. int binarySearch(int x,int a[],int left,int right)
    15. {
    16. int mid=left+(right-left)/2;
    17. if(left<=right)
    18. {
    19. if(a[mid]==x)return mid;
    20. else if(a[mid]>x)return binarySearch(x,a,left,mid-1);
    21. else return binarySearch(x,a,mid+1,right);
    22. }
    23. return -1;//fail
    24. }

    分析:

    注意第20行判断语句为 left<=right 

    运行结果:

     非递归代码:

    1. #include <cstdio>
    2. #include <algorithm>
    3. #define MAX 5
    4. using namespace std;
    5. int binarySearch(int x,int a[],int left,int right);
    6. int main()
    7. {
    8. int a[MAX]={1,3,4,5,9};
    9. printf("find %d location is %d\n",4,binarySearch(4,a,0,MAX-1));
    10. printf("find %d location is %d\n",11,binarySearch(11,a,0,MAX-1));
    11. printf("find %d location is %d\n",9,binarySearch(9,a,0,MAX-1));
    12. return 0;
    13. }
    14. int binarySearch(int x,int a[],int left,int right)
    15. {
    16. int mid;
    17. while(left<=right)
    18. {
    19. mid = left+(right-left)/2;
    20. if(a[mid]==x)return mid;
    21. else if(a[mid]>x)
    22. right = mid-1;
    23. else left = mid+1;//mid值已经比较过了,所以进行加一减一操作去掉这一点
    24. }
    25. return -1;//fail
    26. }

     运行结果:

     

     

  • 相关阅读:
    【ES6知识】async 函数与代码优雅写法
    面试题: 谈一谈对 ThreadLocal 的理解
    编译构建 meson ninja
    性能指标都不了解,如何做性能测试?
    树形dp实例-Orgrimmar
    java 计算对象在内存中占用空间 大小
    寻找二叉树一个节点的后继节点
    ARM 汇编指令集1_2
    Unity与IOS⭐一、百度语音IOS版Demo调试方法
    IP数据报格式
  • 原文地址:https://blog.csdn.net/Zhonexixi/article/details/128128475