算法回顾(三) 二分查找

二分查找,顾名思义,它的原理是,将排序好的数列分成两部分,判断期待值在高位部分还是在低位部分,然后再将期待值所在的那个区间的数列重新按照这个规则划分成两部分,再比较,直到最后不能划分为止。

优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

假设其数组长度为n,那么该算法复杂度为o(log(n))。代码如下:

1 int binarySearch( int *a , int begin, int end, int key)
2 {
3     int mid = begin + ((end - begin)>>1 ), index;
4     index = a[mid] < key && begin +1 < end ? binarySearch(a, mid+1, end ,key):
5                (a[mid] > key && begin + 1 < end ? binarySearch(a, begin, mid, key):
6                  mid*(a[mid] == key) + (-1)*(a[mid] != key) );
7
8     return index;
9 }

ps.第三行是为了防止int相加后超过int的最大值,故采用这样的算法。

时间: 2024-10-10 01:21:21

算法回顾(三) 二分查找的相关文章

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

转载请注明出处: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

算法——基础篇——二分查找

     二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.     首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

算法实现回顾1——二分查找

前话: 为什么写这个系列?算法的精髓除了在于算法的一个设计,更在于算法的一个好的设计.前者可能需求一个好的算法工程师,而后者则需求一个优秀的程序员.很多时候我们往往只希望去了解一种设计思路,但是对于程序员,一种优良的实现是非常重要的.实现的细节才决定成败.毕竟程序员面对和输出的都是程序,而不是思路. 引用: 你真的会二分查找吗?http://blog.csdn.net/int64ago/article/details/7425727二分查找,你真的会吗?http://www.ahathinkin

算法前戏 递归 二分查找 列表查找

一.递归 概念: 函数直接或者间接的调用自身算法的过程,则该函数称为递归函数.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有一个明显的结束条件,称为递归出口.问题规模相比上次递归有所减少, ③递归算法解题通常显得很简洁,但递归算法解题的效率较低.所以一般不倡导使用递归算法设计程序. ④在递归调用的过程当中系统的每一层的返回点.局部变量等开辟了栈来存储.递归函数次数过多容易造成栈溢出等. 所以一般不倡导用递归算法

【基础算法】冒泡排序+二分查找法

1.思考题 (1)有12颗球,1颗是9克,其余的都是10克,怎样在天平上称三次找出9克的那颗质量小的球? 答:第一次:把12颗球分成两半,一半6颗,在天平上称,取质量小的一边: 第二次:把6颗球分成两半,一半三颗,也取质量小的一边: 第三次:取三颗球中任一两颗去称,如果质量相等,那么没有称的那一颗就是质量最小的一颗(9克),如果两颗质量不想等,取质量小的一颗也可以取到. (2)有1024个人,有一个人血液有病毒,而999个人没有病毒,化验一个人的血液需要10分钟,怎么用最短的时间找出有血液病毒的

【C/C++学院】0723-32位与64位/调戏窗口程序/数据分离算法/内存检索/二分查找法/myVC

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并阿赫利运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 32位与64位 地址与内存的关系 4G = 4*1024M = 4*1024*1024k = 4*1024*1024*1024 Byte字节 =

数据结构与算法实践 之 二分查找初识

今天起,我要对数据结构和基本的算法进行一些简单的复习,并在复习的基础上对其进行深入的挖掘.这篇文章先对二分查找进行一个简要的复习,在之后的文章中会对其进行深入的学习. 二分查找又叫折半查找,是最基本的几种查找算法之一.简单的看,二分法查找主要应用于在一个有序数列中进行元素的查找,其基本思路是,先用我们要查找的元素与这个有序数列中的中间位置的元素进行比较(在此我们姑且称这个元素为"中间位置元素"吧,至于这个元素怎么求我在后面会详细说明),如果相等,则返回这个"中间位置元素&qu

算法:时间复杂度+二分查找法(Java/Go/Python)实现

导读 曾几何时学好数据结构与算法是我们从事计算机相关工作的基本前提,然而现在很多程序员从事的工作都是在用高级程序设计语言(如Java)开发业务代码,久而久之,对于数据结构和算法就变得有些陌生了,由于长年累月的码砖的缘故,导致我们都快没有这方面的意识了,虽然这种论断对于一些平时特别注重学习和思考的人来说不太适用,但的确是有这样的一个现象. 而在要出去面试找工作的时候,才发现这些基础都快忘光光了,所以可能就"杯具"了!实际上,对于数据结构和算法相关的知识点的学习,是程序员必须修炼的一门内功

算法题16 二分查找及相关题目

二分查找思想就是取中间的数缩小查找范围,对应不同的题目变形,在取到中间数mid确定下一个查找范围时也有不同,左边界有的low=mid+1,也可能low=mid,右边界有的high=mid-1,也有可能high=mid. 对于一个排序数组来说二分查找的时间复杂度是O(logn) 1. 二分查找法 1 int BinarySearch(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception(&qu