二分查找(针对有序数组)

  9/10/2017,简写一个封装好的二分查找,适用于C/C++



正文如下:

  

int Binary_search(DateType *a,DateType K,const DateType n)
{
	int beg = 1,end = n;
	mid = beg + (end - beg)/2;
	while((mid != end) && (a[mid] != K))
	{
		if(a[mid] < K)
			beg = mid + 1;
		else
			end = mid;
		mid = beg + (end -beg)/2;
	}
	if(a[mid] == K)
		return mid;
	else
		return -1;
}

最坏情况是a[1] or a[n] = k,假设需要二分m次,则有:
n/2 n/4 n/8 ... n/(2^m) = 1;
得2^m = n,所以时间复杂度为O(lg(n))

图解如下:

  

(图片来源于CSDN博主皓皓松

时间: 2024-10-09 21:58:07

二分查找(针对有序数组)的相关文章

二分查找二维数组

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24977113 剑指offer上的第一道题目,在九度OJ上测试通过 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数

【剑指offer】二分查找二维数组

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24977113 剑指offer上的第三道题目.在九度OJ上測试通过 题目描写叙述: 在一个二维数组中,每一行都依照从左到右递增的顺序排序.每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数,推断数组中是否含有该整数. 输入: 输入可能包括多个測试例子,对于每一个測试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和

SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,000] 操作分为三种,1 A:表示在第A个队列加一个人. 2 X:表示求长度大于等于X队列数量.3 Y:表示所有长度大于等于Y的队列减去一个人. 题解: 把各个队列按长度排序 用差分数列来维护这个数组,这样求每个队列的长度就是求前缀和.每次求长度的复杂度是lgn,因为队列是按长度排序的,所以可以通过二分查找到

查找算法(二分查找)

1.二分查找介绍 #描述二分查找: 二分查找针对有序的数据集合,要从有序集合中,找出目标值.每次都把目标值,与区间的中间元素进行对比,将待查找的区间缩小为之前的一半,直到查到要查找的目标元素.或者区间缩小为0. #二分查找实现注意事项: 1.循环退出条件 low<=high 2.mid取值 普通方式:mid=(low+high)/2 改进方式:mid=low+(high-low)/2 终极方式:mid=low+((high-low)>>1) 3.low和high更新 low=mid+1

算法-符号表的实现(顺序查找和二分查找)

符号表是一种存储键值对的数据结构,支持两种操作插入和查找,就是将一组新的键值对存入表中然后根据给定的键得到对应的值,在编程语言中常用Dictionary原理类似.符号表是一种典型的抽象数据结构,在生活之中应用的场景也很多,可以根据钥匙开门,域名解析的时候的IP地址查询,字典和图书的简介和页数,key和value是密不可分的,通过key我们可以很快找到我们需要的value. 无序链表的顺序查找 主要通过Node节点存储数据,之前的博客中有关于链表的实现,详情可参考之前的博客,代码有注释就解释太多了

算法整理-二分查找和排序

1.  二分查找 (1) 有序数组查找插入位置:  主要是终止条件的判断,如果查找不到需要被范围的插入位置为begin public: int searchInsert(vector<int>& nums, int target) { int len = nums.size(); return binarySearch(nums, target, 0, len-1); } private: int binarySearch(vector<int>& nums, in

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

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

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

算法系列&lt;二分查找&gt;

二分查找又称折半查找,是针对有序顺序表的查找,前提:数据是顺序存储的,已经按照关键词进行升序排序.查找成功返回索引值,查找不成功返回-1. 下面用java来实现二分查找算法: /** * 二分查找:针对已排好序的序列,查找成功返回所在位置的索引值,查找不成功返回-1 * 查找的最好时间复杂度:O(1),最坏时间复杂度O(logN),平均时间复杂度:O(logN) * 测试case: * case1:{1} 查找1 * case2:{1} 查找2 * case3:{} 查找1 * case4:{1