二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素有序排列。
- 查找过程
- 此实现过程的实施是通过变量left和right控制一个循环来查找元素(其中left和right是正在查找的数据集的两个边界值)。首先,将left和right分别设置为0和arr.length-1。在循环的每次迭代过程中,将mid设置为left和right之间区域的中间值,即 mid=(left+right)/2。如果处于arr[mid]的元素比目标值小,将左索引值移动到mid后的一个元素的位置上(left=mid+1)。即下一组要搜索的区域是当前数据集的上半区。如果处于mid的元素比目标元素大,将右索引值移动到mid前一个元素的位置上( right=mid-1)。即下一组要搜索的区域是当前数据集的下半区。随着搜索的不断进行,left从左向右移,right从右向左移。一旦在mid处找到目标,查找将停止;如果没有找到目标,left和right将重合。下图显示了此过程。
二分查找的时间复杂度取决于查找过程中分区数可能的最大值。对于一个有n个元素的数据集来说,最多可以进行log n次分区。对于二分查找,这表示最终可能在最坏的情况下执行的检查的次数:例如,在没有找到目标时。所以二分查找的时间复杂度为O(log n)。
2. 二分查找的两种实现方式
- 非递归法:
package Arrays;
import java.util.Scanner;
public class BinarySearch2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入要查找的数:");
int value = scanner.nextInt();
int[] arr = {
8, 12, 23, 34, 35, 67, 87, 91, 102};
//记录开始位置
int left=0;
//记录结束位置
int right=arr.length-1;
//记录中间位置
int mid=(left+right