二分查找算法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之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
随机推荐
- Java8-Stream-No.10
import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.u ...
- [Svelte 3] Use an onMount lifecycle method to fetch and render data in Svelte 3
Every Svelte component has a lifecycle that starts when it is created, and ends when it is destroyed ...
- Spring Framwork Maven dependency
Spring Framwork 更新时间 2019.12.21 统一版本号 <properties> <!-- spring版本号 --> <spring.version ...
- 数据库中的using语句,以及与try……catch……finally的关系
每new一个对象,就会开辟一块资源.using(我们new的对象){……},“}”处自动释放占用的资源(即调用Dispose方法).等效于fianlly中调用Dispose方法. Dispose内部会 ...
- CentOS6与7区别整理
(1)桌面系统 [CentOS6] GNOME 2.x [CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统 [CentOS6] ext4 [CentOS7] xfs (3 ...
- Python一等函数
一等对象 一等对象的定义: (1)在运行时创建 (2)能赋值给变量或数据结构中的元素 (3)能作为参数传给函数 (4)能作为函数的返回结果 ▲ Python中,整数.字符串和字典.函数都是一等对象. ...
- neo4j︱与python结合的py2neo使用教程
—- 目前的几篇相关:—– neo4j︱图数据库基本概念.操作罗列与整理(一) neo4j︱Cypher 查询语言简单案例(二) neo4j︱Cypher完整案例csv导入.关系联通.高级查询(三) ...
- assign修饰对象类型会怎样?
首先我们需要明确,对象的内存一般被分配到堆上,基本数据类型和oc数据类型一般被分配在栈上. 如果用assign修饰对象,当对象释放后(因为不存在强引用,离开作用域对象内存可能被回收),指针的地址还是存 ...
- H5最佳格式
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- 使用git Bash Here 绑定账号密码错误后 无法自动重新绑定
新安装的git 要打开gitbash 运行下面两个命令:1 git config --global user.name "Your Name"2 git config --glob ...