二分查找

原创 2015年11月19日 10:18:02

关于区间的选择,觉得还是闭区间优于左闭右开,选用闭区间。

//[l, r]
//相等的,找不到返回-1
int bs1(int *d, int l, int r, int v){
	while(l <= r){
		int m = (l+r)>>1;
//		printf("%d %d %d\n", l, r, m);
		if(v > d[m]){
			l = m + 1;
		}else if(v < d[m]){
			r = m - 1;
		}else{
			return m;
		}
	}
	return -1;
}
//第一个相等的,不存在则返回第一个>v的,即第一个>=v
int bs2(int *d, int l, int r, int v){
	while(l <= r){
		int m = (l+r)>>1;
//		printf("%d %d %d\n", l, r, m);
		if(v > d[m]){
			l = m + 1;
		}else{
			r = m - 1;
		}
	}
	return l;
}
//最后一个相等的,不存在则返回最后一个<v的,即最后一个<=v
int bs3(int *d, int l, int r, int v){
	while(l <= r){
		int m = (l+r)>>1;
//		printf("%d %d %d\n", l, r, m);
		if(v < d[m]){
			r = m - 1;
		}else{
			l = m + 1;
		}
	}
	return r;
}

bs2,bs3效率不够高,不太严谨,修改如下

    int funl(vector<int> &data ,int k) {
        int l = 0, r = data.size() - 1;
        while(l <= r) {
            if(data[l] == k) return l;
            int m = l + ((r-l) >> 1); 
            if(k > data[m]) l = m + 1;
            else r = m - 1;
        }
        if(l >= 0 && l < data.size() && data[l] == k) return l;
        else return -1;
    }
    int funr(vector<int> &data ,int k) {
        int l = 0, r = data.size() - 1;
        while(l <= r) {
            if(data[r] == k) return r;
            int m = l + ((r-l) >> 1); 
            if(k < data[m]) r = m - 1;
            else l = m + 1;
        }
        if(r >= 0 && r < data.size() && data[r] == k) return r;
        else return -2;
    }


二分查找的一些注意事项

二分查找的一些注意事项 二分查找介绍 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 二分查找的应用二分查找作为O(l...
  • zhouyelihua
  • zhouyelihua
  • 2015年06月27日 23:58
  • 2416

二分查找算法(递归与非递归两种方式)

首先说说二分查找法。 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。 采用非递归方式完成二分查找法。java代码如...
  • lovesummerforever
  • lovesummerforever
  • 2014年04月27日 15:44
  • 87048

二分查找求平方根

#include main() { //input int num ; while( 1 ) { scanf("%d", &num ); int i = 1; ...
  • liudepengzhgd
  • liudepengzhgd
  • 2012年08月09日 16:46
  • 1409

c++实现二分查找

简要描述: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 条件:查找的数组必须要为有序数组。 二分查找的过程剩简要描述如下图: ...
  • luoweifu
  • luoweifu
  • 2013年11月17日 22:25
  • 6479

编程之美之二分查找总结

二分查找
  • fangjian1204
  • fangjian1204
  • 2014年08月20日 15:47
  • 1236

含有重复元素的二分查找算法

rust已经有binary_search了,但不能很好的处理有重复元素的查找。 下面这个是我按照网上查找到的原理自己实现的,这个处理重复元素比较好,如果key有重复,那么总是查找到最小的那个inde...
  • varding
  • varding
  • 2015年09月18日 10:19
  • 2526

二分查找及变种

//有重复元素找到重复元素最大那个的index,没有找到上界限 public int binarySearchLast(int []a ,int key){ int l = 0, h = a.le...
  • litoupu
  • litoupu
  • 2014年11月14日 10:45
  • 831

经典二分查找问题

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1 样例 给出数组 [1, 2, 2, 4, 5, 5]. 对于 target = 2, 返回 1 或者 2.对于...
  • u013289254
  • u013289254
  • 2017年03月16日 19:27
  • 215

[经典面试题]二分查找问题汇总

【题目】 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1。 【分析】 此题也就是求target在数组中第一次出现的位置。这里可能会有人想先直接...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月05日 12:16
  • 3468

无序数组的二分查找

对于有序数组,我们只需要简单的二分查找就可以了,但是对于无序数组,我们可以先排序在二分,但还有一种技巧就是结合快排的思想,即每次选择一个关键字,先将比他大的数放在其右边,比他小的数放在其左边,然后比较...
  • jinjiahao5299
  • jinjiahao5299
  • 2015年03月09日 13:14
  • 1464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找
举报原因:
原因补充:

(最多只允许输入30个字)