1. /*************************************************************************
  2. > File Name: binary_search.cpp
  3. > Author:
  4. > Mail:
  5. > Created Time: 2015年11月11日 星期三 14时24分09秒
  6. ************************************************************************/
  7.  
  8. #include <iostream>
  9. #include <vector>
  10. #include <algorithm>
  11.  
  12. using namespace std;
  13.  
  14. void output_vector(const vector<int> &v)
  15. {
  16. cout << "The vector is :";
  17. for (vector<int>::const_iterator it = v.begin(); it != v.end(); it++){
  18. cout << *it << " ";
  19. }
  20. cout << endl;
  21. }
  22. /*recursion递归查找*/
  23. int binary_search_recursion(const vector<int> &v, int low, int high, int goal)
  24. {
  25. if (low <= high){
  26. int middle = (low + high) / 2;
  27. if (goal == v[middle])
  28. return middle;
  29. else if (goal > v[middle])
  30. binary_search_recursion(v, middle+1, high, goal);
  31. else
  32. binary_search_recursion(v, low, middle-1, goal);
  33. }
  34. else
  35. return -1;
  36. }
  37.  
  38. /*不是递归*/
  39. int binary_search(const vector<int> &v, int high, int goal)
  40. {
  41. int low = 0, middle = 0;
  42.  
  43. while(low <= high){
  44. middle = (low + high) / 2;
  45. if(goal == v[middle])
  46. return middle;
  47. else if(goal > v[middle])
  48. low = middle+1;
  49. else
  50. high = middle-1;
  51. }
  52.  
  53. return -1;
  54. }
  55.  
  56. int main()
  57. {
  58. int num;
  59. cout << "input the num of the data:";
  60. cin >> num;
  61. vector<int> v;
  62. cout << "Input the data to the vector:" << endl;
  63. int val;
  64. while(num != 0){
  65. cin >> val;
  66. v.push_back(val);
  67. num--;
  68. }
  69.  
  70. output_vector(v);
  71. sort(v.begin(), v.end());
  72. cout << "After sort ";
  73. output_vector(v);
  74.  
  75. cout << "input the goal value to find: ";
  76. int goal;
  77. cin >> goal;
  78. /*递归*/
  79. int index = binary_search_recursion(v, 0, v.size()-1, goal);
  80. if (index != -1)
  81. cout << "goal is == v[" << index << "]" << endl;
  82. else
  83. cout << "goal is not at the vector" << endl;
  84. /*非递归*/
  85. index = binary_search(v, v.size(), goal);
  86. if (index != -1)
  87. cout << "goal is == v[" << index << "]" << endl;
  88. else
  89. cout << "goal is not at the vector" << endl;
  90.  
  91. return 0;
  92. }

二分查找是从一组已经排好序的数据查找某一个值(本程序是默认的是数据从小到大进行排序);
第一种是方法可以用递归来实现;第二种不是递归,而是循环;

其实主要思想都是一样的:
如果目标值等于数组的中间值,则返回中间值的索引号;
如果目标值大于数组的中间值,则在数组的上半部分进行查找;
如果目标值小于数组的中间值,则在数组的下半部分进行查找;

每次查找都会重新计算机middle的值;

二分查找算法C++实现的更多相关文章

  1. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  2. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

  3. 二分查找算法(JAVA)

    1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位 ...

  4. 二分查找算法java实现

    今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...

  5. Java学习之二分查找算法

    好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...

  6. python函数(4):递归函数及二分查找算法

    人理解循环,神理解递归!  一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? ""& ...

  7. python实现二分查找算法

    二分查找算法也成为折半算法,对数搜索算法,一会中在有序数组中查找特定一个元素的搜索算法.搜索过程是从数组中间元素开始的 如果中间元素正好是要查找的元素,则搜索过程结束:如果查找的数大于中间数,则在数组 ...

  8. 剑指Offer——二分查找算法

    剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...

  9. C++二分查找算法演示源码

    如下内容段是关于C++二分查找算法演示的内容. #include <cstdio>{ int l = 0, r = n-1; int mid; while (l <= r){ mid ...

  10. Java之二分查找算法

    算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...

随机推荐

  1. Python3-def

    def hello(): print("这是一个无参数的方法!") hello(); print("") def helloOne(str): print(st ...

  2. 05 django组件:contenttype

    1.django组件:contenttype 组件的作用:可以通过两个字段让表和N张表创建FK关系 1.专题课,学位课 如何关联 过期时间?? 方法1:分别创建 专题课--过期时间表 .学位课--过期 ...

  3. .NET大文件分片上传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  4. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  5. Educational Codeforces Round 53 E. Segment Sum(数位DP)

    Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...

  6. HDU 4496 D-City —— (并查集的应用)

    给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块. 分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了..方法就是,记录每一条边,然后从最后一条边开始不断的 ...

  7. 微擎转移服务器后,出现 require()错误,解决方案

    微擎中切换服务器后出现该问题,有可能是导致配置的问题

  8. arcgis 面或线要素类上的搜索游标

    import arcpy infc = arcpy.GetParameterAsText(0) # Identify the geometry field # desc = arcpy.Describ ...

  9. linux系统空间不足,不重启进程,清理僵尸文件。

    问题:通过lsof |grep delete命令可以看到状态为delete的进程文件占用了较多的空间,导致系统磁盘空间不足,而du 命令看到的磁盘空间占用没那么高. 得到僵尸文件名称:catalina ...

  10. 2.3 Go语言基础之数组

    本文主要介绍Go语言中数组(array)及它的基本使用. 一.Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基 ...