二分查找或折半查找

原创 2018年04月16日 10:51:07

一、如果我们的目标对象在一个有序的线性表中,从小到达排列,我们就可以采用二分查找,也叫折半查找。

          二分查找或折半查找的时间复杂度为O(logn)。

二、闲话少说,直接上代码

/**
	 * 二分查找、折半查找
	 * @param array 目标有序序列,从小到大排列
	 * @param target  待查找的目标对象
	 * @param fromIndex  数组的开始查找下标位置
	 * @param toIndex    数组的结束查找下标位置
	 * @return 数组的位置
	 */
	
	private static int binarySearch(int[] array, int target, int fromIndex, int toIndex) {
		if (fromIndex > toIndex) {
			return -(fromIndex+1);
		}
		
		while(toIndex >= fromIndex){
			int mid = (fromIndex + toIndex) / 2;
			if (array[mid] == target) {
				return mid;
			}else if (target < array[mid]) {
				toIndex = mid - 1;
			} else {
				fromIndex = mid + 1;
			}
		}
		return -(fromIndex+1);
	}


若我们的目标对象实现了Comparable接口,我们还可写成通用的形式

/**
	 * 二分查找、折半查找
	 * @param array 目标有序序列,从小到大排列
	 * @param target  待查找的目标对象
	 * @param fromIndex  数组的开始查找下标位置
	 * @param arrayLength    array.length
	 * @return 数组的位置
	 */
	private static int binarySearchByComparable(Object[] array, int fromIndex, int arrayLength, Object key) {
		int low = fromIndex;
		int high = arrayLength - 1;

		while (low <= high) {
			int mid = (low + high) >>> 1;
			@SuppressWarnings("rawtypes")
			Comparable midVal = (Comparable) array[mid];
			@SuppressWarnings("unchecked")
			int cmp = midVal.compareTo(key);

			if (cmp < 0)
				low = mid + 1;
			else if (cmp > 0)
				high = mid - 1;
			else
				return mid; // key found
		}
		return -(low + 1); // key not found.
	}

【数据结构】折半查找(二分查找)

折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,...
  • kuzuozhou
  • kuzuozhou
  • 2012年09月15日 21:03
  • 1096

【C/C++】折半查找(二分查找)

一、二分查找 在C和C++里,二分查找是针对有序数组所用的一种快速查找元素的方法。 二、二分查找的条件以及优缺点 条件:针对有序数组(元素从小到大或从大到小) 优点:查询速度较快,时间复杂度为O(n)...
  • qq_31828515
  • qq_31828515
  • 2016年06月30日 17:34
  • 17404

C#学习笔记—数组的折半查找(二分查找)

//方法类 using System; using System.Collections.Generic; using System.Linq; using System.Text; n...
  • rart2008
  • rart2008
  • 2010年06月18日 00:34
  • 3509

PHP有序表查找----二分查找(折半)

简介:二分查找技术,又称为折半查找。它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储。基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,...
  • baidu_30000217
  • baidu_30000217
  • 2016年11月06日 22:09
  • 789

二分查找与判定树

二分查找是一种效率比较高的查找算法,但是它依赖于数组有序的存储,二分查找的过程可以用二叉树来形容描述:把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根节点的左子树和右子树。由此...
  • gogoky
  • gogoky
  • 2016年05月10日 15:07
  • 4758

【数据结构与算法】【查找】折半查找(二分查找)的代码实现

折半查找(Binary Search):也称为二分查找。它的前提是:1、线性表中的记录必须是关键字有序(通常是从小到大有序);2、线性表必须采用顺序存储。 折半查找的基本思想是:在有序表中,取中间记...
  • jay_yin
  • jay_yin
  • 2014年11月04日 19:38
  • 2653

hdu 1957 find the nth digit【二分查找】

find the nth digit Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other...
  • mengxiang000000
  • mengxiang000000
  • 2016年03月19日 13:40
  • 582

“二分查找”算法的时间复杂度

算法的时间复杂度无非就是for、while等包含起来的基本运算单元的循环次数1、二分查找二分查找(binary search),也称作折半查找(half-interval search),每次划分一半...
  • u010983881
  • u010983881
  • 2016年04月06日 14:03
  • 15739

PHP实现折半(二分)查找算法

/** * Description:php实现二分查找算法的类 * @author wzy */ class binary_search{ public $arr; public $key;...
  • climb_up
  • climb_up
  • 2013年09月21日 17:21
  • 1621

C语言实现折半查找(二分查找)的算法

编写一个程序exp9-2.cpp,输出在顺序表(1,2,3,4,5,6,7,8,9,10)中采用折半查找方法查找关键字9的过程。 //文件名:exp9-2.cpp #include #define ...
  • m0_37396057
  • m0_37396057
  • 2017年12月07日 14:44
  • 74
收藏助手
不良信息举报
您举报文章:二分查找或折半查找
举报原因:
原因补充:

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