二分查找的算法原理较为简单,在此给出c++代码实现,以及代码中遇到的问题,以及解决方案:

 # include "iostream"
using namespace std; //template <class, T>
int Binary_search( const int vector[] , int value)//采用泛型的方式
{
//T* low = vector[0];
//T* high = sizeof(vetor) / sizeof(vetor)+vector[0]-1;
int low = ;//获取最低位
int high = sizeof(vector) / sizeof(vector[])-;//这里显示的vector
cout << "vector:" << sizeof(vector) << endl;//这里sizeof vector等于=4,并不是4*13等于32???思考这是为什么
cout<<";vector[0]:" << sizeof(vector[]) << endl;
cout << "high:" << high << endl;
//T *middle = (low + high) / 2;
int middle;
while (low <= high)
{
middle = (low + high) / ;
if (vector[middle] > value)
{
high = middle - ;
}
if (vector[middle] < value)
{
low = middle + ;
}
if (vector[middle] == value)
{
return middle;
}
}
}
int main()
{
const int a[] = { , , , , , , , , , , , , };
cout <<"a:" <<sizeof(a) << endl;
cout<<Binary_search(a, )<<endl;
system("pause");
return ;
}

其中,while(){}代码段实现了二分查找的原理,但程序的运行结果并不正确。

我们知道通过 :sizeof(a)/sizeof(a[0])可以得到数组a的长度,但是经过参数传递,我们以为sizeof(vector)/sizeof(vector[0]) == sizeof(a)/sizeof(a[0])!!!但实际上,这是错误的!!!。数组不等于指针!!!。数组a传递给 vector,我们以为的是:将数组a的内容复制到数组vector,但实际的处理过程是:vector仅仅是一个指针,指向了数组a这块区域,但我们并不能通过这个指针vector来获得这块区域的大小。而sizeof(vector)也就成了我们得到的是指针变量的大小!!!,而不是指针所指向区域的大小!!!!。这是很重要的区别。

但是二分查找明显要求我们得到查找数据的长度。那么我们该如何得到这个长度呢?

一种方法是我们在主程序中先得到数据的长度,将长度作为一个函数参数进行传递。但这种方式真的很蠢(个人觉得真的很蠢!!!,因为这样不能体现算法本身的封装性)。那么有没有其他方法呢?

如果我们采用泛型加引用的方式呢?

 # include "iostream"
using namespace std; template <class T>
int Binary_search( const T & vector ,const T value)//采用泛型的方式
{
int low = ;
int high = sizeof(vector) / sizeof(vector[])-;
cout << "high:" << high << endl;
int middle;
while (low <= high)
{
middle = (low + high) / ;
if (vector[middle] > value)
{
high = middle - ;
}
if (vector[middle] < value)
{
low = middle + ;
}
if (vector[middle] == value)
{
return middle;
}
} }
int main()
{
const int a[] = { , , , , , , , , , , , , };
cout <<"a:" <<sizeof(a) << endl;
//const int value = 5;
cout<<Binary_search(a,)<<endl;//无法执行
system("pause");
return ;
}

我们的本意是:忽略传递数组的类型,采用泛型的思想设计程序,但是程序报错:

错误 1 error C2782: “int Binary_search(const T &,const T)”: 模板 参数“T”不明确 c:\users\kb409\desktop\c++\binary search\binary search\binary search.cpp 34 1 Binary search

由于泛型编程掌握的并不是很好,所以并不知道这样做错在哪里,如果有大神知道,请给我留言!

最后,将代码改成了下面这个样子,程序通过:

 # include "iostream"
using namespace std; template <class T>
int Binary_search( const T & vector ,const int value)//采用泛型的方式
{
int low = ;
int high = sizeof(vector) / sizeof(vector[])-;
cout << "high:" << high << endl;
int middle;
while (low <= high)
{
middle = (low + high) / ;
if (vector[middle] > value)
{
high = middle - ;
}
if (vector[middle] < value)
{
low = middle + ;
}
if (vector[middle] == value)
{
return middle;
}
} }
int main()
{
const int a[] = { , , , , , , , , , , , , };
//cout <<"a:" <<sizeof(a) << endl;
//const int value = 5;
cout<<Binary_search(a,)<<endl;//可以执行
system("pause");
return ;
}

所做的改变仅仅是将第五行const T value改变成了 int value ,鉴于目前知识水平有限吗,对模板的使用并不是很熟练,在后续中逐渐弄明白这个问题

二分查找c++实现的更多相关文章

  1. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

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

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

  3. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  4. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  5. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

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

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

  7. 【Python】二分查找算法

    二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...

  8. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  9. java二分查找举例讨论

    最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...

  10. JAVA源码走读(二)二分查找与Arrays类

    给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...

随机推荐

  1. ORA-01940 无法删除当前已连接的用户之解决方案

    在执行drop user的时候,提示报错信息:ORA-01940: cannot drop a user that is currently connected SQL> drop user l ...

  2. Spring webflux

    Spring-webflux Spring 5.0 Spring-webflux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的.非堵塞的.事件驱动的服务. sprin ...

  3. 原生js获取元素非行内样式属性的方法

    获取当前对象的样式DOM标准中的全局方法 getComputedStyle(obj).width (获取元素的宽度),但在非标准IE浏览器(IE8)以下有兼容问题IE8以下要这样写 obj.curre ...

  4. 一种递推组合数前缀和的Trick

    记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...

  5. Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法

    微软动态CRM专家罗勇 ,回复299或者20190120可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dynamics 3 ...

  6. 全球排名第一的免费开源ERP Odoo 12产品上海发布会报名开始

    Odoo V12 产品上海发布会暨企业数字化转型论坛 点击进入活动报名通道 高成本的软件开发,耗时的系统安装,繁琐的操作培训… 这一系列问题都是企业数字化管理的痛点, "软件"成为 ...

  7. java 线程方法 ---- join()

    class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...

  8. MUI ios下用video标签默认全屏播放

    前几天用Hbuilder+MUI做了个应用,里边用到<video>标签,在Android下正常,但是在苹果手机老是默认全屏播放. 解决办法: 首先在video标签加上playsinline ...

  9. 常用Shell脚本命令(备忘)

    此处纪录一些个人常用的Shell命令,留作复用 Linux 必备软件 Tmux 终端复用神器 zsh 无比强大Shell运行环境 oh my zsh 搭配zsh食用 uGet Linux下载工具 Do ...

  10. 借助表达式树感受不一样的CRUD

    借助表达式树感受不一样的CRUD Intro 最近有个想法,想不写 sql 语句,做一个类似于 ORM 的东西,自己解析表达式树,生成要执行的 sql 语句,最后再执行 sql 语句,返回相应结果. ...