二分查找c++简单模板

//数组a[]中有n各元素,已经按升序排序,待查找的元素x
sort(a,a+n); //升序排序
template<class Type>
int BinarySearch(Type a[],const Type&x,int n)
{
int left=0; //左边界
int right=n-1; //右边界
while(left<=right)
{
int middle=(left+right)/2; //中点
if(x==a[middle])return middle; //找到x,返回数组中的位置
if(x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1; //未找到x
}

时间: 2024-10-03 09:15:29

二分查找c++简单模板的相关文章

【模板】二分查找

二分查找就是指对于一个有序数列,取其中间值,与要查找的值比较,若大于,则舍弃右半部分序列,若小于则舍弃左半部分序列,其复杂度是O(logn)的.二分查找看似简单,但到处都说要想不出错很难. inline int search(int *arr,int size,int key) { //内联查找函数,参数为序列数组,数组大小及查找的值     int left=0,right=size; //定义整型变量left置为0,right置为size     int mid; //定义整型变量mid  

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

二分查找原理和实现

前言 的确,我一开始的时候也认为二分查找挺简单的,但是在我对二分查找进行总结的时候,发现虽然思路很简单,但是代码要写的正确就不容易了. 区间 需要注意的是 注意计算的区间是左闭右开区间[)还是左闭右闭区间[],两者的代码是不太一样的. 左闭右闭区间 如果说你使用的是左闭右闭区间: int search3(int array[], int n, int target) { int left = 0; int right = n - 1; //比如说只有一个情况下 while (left <= ri

二分查找、二分查找大于等于key的第一个元素、二分查找小于等于key的最后一个元素

二分查找很简单,二分查找的变形需要注意一些细节. 1.当找大于等于key的第一个元素,或者查找小于等于key的最后一个元素时, 循环条件是 low < high,这和基本的二分查找不同, 但需要在循环退出的时候,判断是否满足条件: 2.如果是找最后一个满足条件的情况, 下限移动时不能用 low=mid+1:而应该用 low=mid: 此时,mid计算时应该用 mid=(low+high+1)/2, 保证 最后low.high相差1时不会陷入死循环, 循环退出后,下限可能是结果: 3.如果是找第一

查找(一):二分查找和二叉查找树

二分查找 二分查找的原理很简单:在一个有序数组中(本文讨论的是升序,降序同理) 从数组中间的元素开始,如果A[mid]大于被查找元素key,那么就在A[0]到A[mid-1]中查找,反之在A[mid++]到A[A.lenth - 1]中查找. 从这看来,递归的意味又很浓啊,当然也可以用非递归的方式,效率更高,意味二分查找比较简单,就直接上代码了: 定义一个查找抽象基类: public abstract class SearchBase { public Integer[] a = {0 ,1 ,

二分查找求解equal_range区间

总觉得二分查找很简单,可实现起来却发现一个小错误会导致程序结果出错,本题是解决眼高手低的利题. eaual_range返回的一对指针,指向第一个等于key值得元素和指向第一个大于该值的元素.因此,除了常规的非重复元素的二分查找(重复元素可能查找到任意一个值),还可以实现equal_range的方式考察. 先看常规的二分查找 int binsearch(int arr[], int left, int right, int key) { if(arr == nullptr) return -1;