二分查找的正确写法

二分查找主要有三点需要注意:

1、边界问题

2、求中点时的溢出问题

3、有重复值时定位第一个

代码如下:

int BinarySearch(int array[], int n, int v)
{
	int left, right, middle;
	left = -1, right = n;
	while (left + 1 != right)
	{
		middle = left + (right - left) / 2;
		if (array[middle] < v)
		{
			left = middle;
		}
		else
		{
			right = middle;
		}
	}

	if (right >= n || array[right] != v)
	{
		right = -1;
	}
	return right;
}
时间: 2024-11-08 17:17:56

二分查找的正确写法的相关文章

养成良好的编程风格--论二分查找的正确姿势

摘自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度.在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置,似乎我学到的算法中,时间复杂度

二分查找编码套路

二分查找的思想很好理解,但要写出没有bug的代码却并不是件容易的事.对于有序数组的二分查找,可以遵循一些套路快速写出无错代码. 下面先给出二分查找有序数组的一些问题,所有问题参考了<编程之美>. 1.给定非降序数组A,求任意一个i使得A[i]等于target,如不存在则返回-1. 2.给定非降序数组A,求最小的i使得A[i]等于target,如不存在则返回-1. 3.给定非降序数组A,求最大的i使得A[i]等于target,如不存在则返回-1. 4.给定非降序数组A,求最小的i使得A[i]大于

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in

二分查找 : 那个隐藏了 10 年的 Java Bug

一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题.在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那就是去实现二分查找. 因为它很好写,却很难写对.可以想象问了这道题后,在5分钟之内面试的同学会相当自信的将那一小段代码交给我们,剩下的就是考验面试官能否在更短的时间内看出这段代码的bug了. 二分查找是什么呢,这个不只程序员,其他很多非技术人员也会.比如我想一个1到100以内的数,你来猜,我告诉你每次猜的是大了还是小了,你会先猜50,然后

某科学的二分查找

最近学了一点二分查找,虽然算法难度不是很大,但是在noip中还是比较重要的. 接下来是我对查找算法的思考.(若有疏漏之处,敬请指出) 1.查找方式有两种: (1)线性查找:什么意思呢?就是暴力的用for循环去扫整个数组,枚举就完事儿了. (2)二分查找:利用中间节点mid进行标记,dio就完事儿了. 2.对于二分查找的一点引入: 猜数字的游戏全世界都玩过吧,给定一个范围,告诉大了还是小了,猜数字. 这是一个很简单也很经典的题目,也是二分的一个体现,这道题目的最佳策略很明显,折半思考就好了. 接下

二分查找实现(Jon Bentley:90%程序员无法正确实现)

二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过这句话,但我还是想引用<编程珠玑>上的如下几段文字:“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T 的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T 进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,

二分查找的递归和非递归写法

一.概述 二分查找是针对有序数列的,对无序数列是无效的,在有序序列中使用二分查找能大大提高查找效率,通常能将时间按复杂度从O(n)降至O(logn). 二.查找某数的位置(或存在性) 递归: 1 //返回"-1"表示为找到 2 //否则返回目标的下标(若有多个,只是其中一个) 3 int binary_searchs(int *arr, int target, int l, int r) 4 { 5 if (l > r) return -1; 6 int mid = (l + r

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

二分算法入门——二分查找

二分查找,无论是从名字还是理论都十分简单一个算法,其博大精深,简直恐怖.Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码. 别人不知道,反正我早上是写了好久,这个查找算法,将查找的复杂度从 o( n ) 降到了 o( logn ) ,当之无愧的的好算法,更是许多高级算法的优化策略之一. 二分查找之基本思路 虽然二分查找是一个很吊的算法,但是跟很多算法一样,需要使用的基础条件——序列有序! 先假设一个单调非增序列:1 2 3 4 5 6 ,求找到3的位置,地球人都会马上这么