二分查找算法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之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
随机推荐
- BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)
Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...
- @ComponentScan什么时候可以不加
SpringBoot在没配置@ComponentScan的情况下,默认只扫描和主类处于同包下的Class. 主类Application.java: import org.springframework ...
- http method
get: 获取资源get方法用来请求访问已被URL识别的资源 post: 传输实体主体POST方法用来传输实体的主体 put: 传输文件PUT方法用来传输文件. head: 获取报文首部head方法与 ...
- Word:自动编号超过9后缩进太大
造冰箱的大熊猫,本文适用于Microsoft Office 2007@cnblogs 2019/7/30 文中图片可通过点击鼠标右键查看大图 1.场景 如下图所示,使用Word的自动编号功能时,当编 ...
- 2019CSP-J第二轮 B题C题
B.简单模拟 /* 寻找每一张公交票可用的最早的地铁优惠票,使用过之后一定要销毁*/ #include <iostream> #include <cstdio> #includ ...
- SpringMVC——拦截器,过滤器实现登录拦截
一.拦截器与过滤器的区别 1.过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操 ...
- 原生javascript封装动画库
****转载自自己发表于牛人部落专栏的文章**** 一.前言 本文记录了自己利用原生javascript构建自己的动画库的过程,在不断改进的过程中,实现以下动画效果: 针对同一个dom元素上相继发生的 ...
- docker打包项目部署
1.首先在本地安装docker,步骤可参考https://www.cnblogs.com/conswin/p/11055853.html 2.在对应项目目录下增加Dockerfile文件,其内容可参考 ...
- skbuff
在2.6.24之后这个结构体有了较大的变化,此处先说一说2.6.16版本的sk_buff,以及解释一些问题. 一. 先直观的看一下这个结构体~~~~~~~~~~~~~~~~~~~~~~在下面解释每个字 ...
- JS高级_变量提升和函数提升
先执行变量提升,后执行函数提升 function a(){} var a console.log(typeof a)//function