【详解】Java实现二分查找(折半查找)

1、概述思想

       二分查找又称折半查找,优点是比较的次数少,查找速度快,但是要求待查找的序列是有序的。升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,,如果等于key则返回,如果大于关键字key,则在前一个数据集合中查找,否则在后一个子集中查找,直到找到为止,如果没找到则返回-1;

2、算法思想

① 首先确定整个查找区间的中间位置mid=low + (high - low)/2;

② 用待查关键字值与中间位置关键字值进行比较;

  若相等,则查找成功;

  若大于,则在后半个区域中继续进行折半查找。

  若小于,则在前半个区域中继续进行折半查找。

  查找成功,返回关键字所在数组下标,没找到返回-1。

注意:二分查找中中间值的计算:

  这是一个经典的话题,如何计算二分查找中的中值?大家一般给出了两种计算方法:

  • 算法一: mid = (low + high) / 2
  • 算法二: mid = low + (high – low)/2

   乍看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。但是实际上,区别是存在的。算法一的做法,在极端情况下,(low + high)存在着溢出的风险,进而得到错误的mid结果,导致程序错误。而算法二能够保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。

3、代码实现

package com.it.select;

public class binarySearch {
	
	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,6,7,10};
		int middle = binarySearch(10, arr, 0, arr.length-1);
		System.out.println(arr[middle]);
	}
	
	// 返回的是要查询数组元素的下标
	public static int binarySearch(int key,int[] array,int left,int right) {
		
		if(key < array[left] || key > array[right] || left > right) {
			return -1;
		}
		
		//取数组下标的中间值
		int mid = left + (right - left)/2;
		if(array[mid] > key) {
			return binarySearch(key, array, left, mid-1);
		}else if(array[mid] < key) {
			return binarySearch(key, array, mid + 1, right);
		}else {
			return mid;
		}
	}
}

4、算法度分析

 二分查找的时间复杂度是O(log2n)

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/114883010
今日推荐