二分查找或折半查找

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

          二分查找或折半查找的时间复杂度为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.
	}

猜你喜欢

转载自blog.csdn.net/u013309822/article/details/79957403