二分查找c++实现
二分查找的算法原理较为简单,在此给出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++实现的更多相关文章
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
- java实现二分查找
/** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...
- 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布
最新IP地址数据库 来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...
- c#-二分查找-算法
折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...
- 【Python】二分查找算法
二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- java二分查找举例讨论
最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...
- JAVA源码走读(二)二分查找与Arrays类
给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...
随机推荐
- 前端异步技术之Promise
前言 从事前端的朋友或多或少的接触过Promise,当代码中回调函数层级过多你就会发现Promise异步编程的魅力,相信此文一定能帮你排忧解惑! Promise概念 Promise是JS异步编程中的重 ...
- RESTful杂记
在网上找了许久的关于REST的资料,发现网上大部分都是说的比较片面,虽然有部分说出了本质,但也没有详细提出,所以在这里记录一下. RESTful是什么 首先,维基百科是这样说的: 表现层状态转换(RE ...
- Java开发笔记(四十)日期与字符串的互相转换
前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...
- @RequestParam Map<String, Object> paramMap
@RequestParam 请求方式 url = "/edit?device=${device}&type=${type}" Controller @RequestMapp ...
- 我从来不理解JavaScript闭包,直到有人这样向我解释它...
摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...
- Dynamics 365中的非交互式账号(Non-interactive User)介绍
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复272或者20180616可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
- 从.Net到Java学习第八篇——SpringBoot实现session共享和国际化
从.Net到Java学习系列目录 SpringBoot Session共享 修改pom.xml添加依赖 <!--spring session--> <dependency> & ...
- spring学习总结——高级装配学习一(profile与@Conditional)
前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...
- Python3漏洞扫描工具 ( Python3 插件式框架 )
目录 Python3 漏洞检测工具 -- lance screenshot requirements 关键代码 usage documents README Guide Change Log TODO ...
- sqlserver数据库触发器调用外部exe
sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...