二分查找算法C++实现
- /*************************************************************************
- > File Name: binary_search.cpp
- > Author:
- > Mail:
- > Created Time: 2015年11月11日 星期三 14时24分09秒
- ************************************************************************/
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- void output_vector(const vector<int> &v)
- {
- cout << "The vector is :";
- for (vector<int>::const_iterator it = v.begin(); it != v.end(); it++){
- cout << *it << " ";
- }
- cout << endl;
- }
- /*recursion递归查找*/
- int binary_search_recursion(const vector<int> &v, int low, int high, int goal)
- {
- if (low <= high){
- int middle = (low + high) / 2;
- if (goal == v[middle])
- return middle;
- else if (goal > v[middle])
- binary_search_recursion(v, middle+1, high, goal);
- else
- binary_search_recursion(v, low, middle-1, goal);
- }
- else
- return -1;
- }
- /*不是递归*/
- int binary_search(const vector<int> &v, int high, int goal)
- {
- int low = 0, middle = 0;
- while(low <= high){
- middle = (low + high) / 2;
- if(goal == v[middle])
- return middle;
- else if(goal > v[middle])
- low = middle+1;
- else
- high = middle-1;
- }
- return -1;
- }
- int main()
- {
- int num;
- cout << "input the num of the data:";
- cin >> num;
- vector<int> v;
- cout << "Input the data to the vector:" << endl;
- int val;
- while(num != 0){
- cin >> val;
- v.push_back(val);
- num--;
- }
- output_vector(v);
- sort(v.begin(), v.end());
- cout << "After sort ";
- output_vector(v);
- cout << "input the goal value to find: ";
- int goal;
- cin >> goal;
- /*递归*/
- int index = binary_search_recursion(v, 0, v.size()-1, goal);
- if (index != -1)
- cout << "goal is == v[" << index << "]" << endl;
- else
- cout << "goal is not at the vector" << endl;
- /*非递归*/
- index = binary_search(v, v.size(), goal);
- if (index != -1)
- cout << "goal is == v[" << index << "]" << endl;
- else
- cout << "goal is not at the vector" << endl;
- return 0;
- }
二分查找是从一组已经排好序的数据查找某一个值(本程序是默认的是数据从小到大进行排序);
第一种是方法可以用递归来实现;第二种不是递归,而是循环;
其实主要思想都是一样的:
如果目标值等于数组的中间值,则返回中间值的索引号;
如果目标值大于数组的中间值,则在数组的上半部分进行查找;
如果目标值小于数组的中间值,则在数组的下半部分进行查找;
每次查找都会重新计算机middle的值;
二分查找算法C++实现的更多相关文章
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- c#-二分查找-算法
折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...
- 二分查找算法(JAVA)
1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位 ...
- 二分查找算法java实现
今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...
- Java学习之二分查找算法
好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...
- python函数(4):递归函数及二分查找算法
人理解循环,神理解递归! 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? ""& ...
- python实现二分查找算法
二分查找算法也成为折半算法,对数搜索算法,一会中在有序数组中查找特定一个元素的搜索算法.搜索过程是从数组中间元素开始的 如果中间元素正好是要查找的元素,则搜索过程结束:如果查找的数大于中间数,则在数组 ...
- 剑指Offer——二分查找算法
剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...
- C++二分查找算法演示源码
如下内容段是关于C++二分查找算法演示的内容. #include <cstdio>{ int l = 0, r = n-1; int mid; while (l <= r){ mid ...
- Java之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
随机推荐
- Python3-def
def hello(): print("这是一个无参数的方法!") hello(); print("") def helloOne(str): print(st ...
- 05 django组件:contenttype
1.django组件:contenttype 组件的作用:可以通过两个字段让表和N张表创建FK关系 1.专题课,学位课 如何关联 过期时间?? 方法1:分别创建 专题课--过期时间表 .学位课--过期 ...
- .NET大文件分片上传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- HDU 4496 D-City —— (并查集的应用)
给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块. 分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了..方法就是,记录每一条边,然后从最后一条边开始不断的 ...
- 微擎转移服务器后,出现 require()错误,解决方案
微擎中切换服务器后出现该问题,有可能是导致配置的问题
- arcgis 面或线要素类上的搜索游标
import arcpy infc = arcpy.GetParameterAsText(0) # Identify the geometry field # desc = arcpy.Describ ...
- linux系统空间不足,不重启进程,清理僵尸文件。
问题:通过lsof |grep delete命令可以看到状态为delete的进程文件占用了较多的空间,导致系统磁盘空间不足,而du 命令看到的磁盘空间占用没那么高. 得到僵尸文件名称:catalina ...
- 2.3 Go语言基础之数组
本文主要介绍Go语言中数组(array)及它的基本使用. 一.Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基 ...