JavaSE基础 - 数组的折半查找(两种方法)

本文介绍了折半查找的基本原理及其在有序数组中查找指定元素的过程。通过示例详细展示了折半查找的具体步骤,并提供了两种实现方法的Java代码。适用于理解折半查找算法及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说,我们更擅长编写顺序查找(遍历)的代码。但是数组的折半查找效率更高一点。

折半查找的原理:每次查找的范围不断缩小一半,直到max < min时终止循环。

折半查找的优缺点:(优点)比较次数少,查找速度快,平均性能好;(缺点)待查表必须有序。

下面我将使用原始数组为:12,31,44,67,89,101,120 来解释查找过程。如下图:


第一次查找:因为 arr[mid] < key,所以 min = mid + 1 = 4, mid = (min + max)/2 = 5, max不变。如下图:


第二次查找时,由于arr[mid] = key,所以查找结束,终止循环。

由于事先定义的数组数据不是能更好的Demo折半过程,但是折半查找的结果就是这样。当然,也不能忘了未查找到的情况。如下图:


代码如下(两种查找方法):

import java.util.Scanner;

class Search 
{
	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		int[] arr = {12,31,44,67,89,101,120};

		System.out.print("Please input a int num : ");
		int key = input.nextInt();

		int index = binarySearch02(arr,key);
		System.out.println("Index = " + index);
	}

	public static int binarySearch01(int[] arr,int key)	//折半查找法-1
	{
		int min = 0,max = arr.length - 1,mid;

		mid = (max + min ) / 2;	

		while(arr[mid] != key)
		{
			if(arr[mid] < key){
				min = mid + 1;			//在中间值小于key值的前提下,min值加1。
				mid = ( min + max ) / 2;
			}else if(arr[mid] > key){
				max = mid - 1;			//在中间值大于key值的前提下,max值减1。
				mid = ( max + min ) / 2;
			}

			if(max < min) return -1;	//如果max的值小于min的值,则表示没有找到key值,终止循环。
		}

		return mid;
	}

	public static int binarySearch02(int[] arr,int key) //折半查找法-2
	{
		int min = 0,max = arr.length - 1,mid;
		
		while(min <= max){
			mid=(max + min)>>1;    //位运算右移两位,相当于除2

			if( key > arr[mid]){
				min = mid + 1;
			}else if(key < arr[mid]){
				min = mid - 1;
			}else{
				return mid;		//找到返回数组的角标值。
			}
		}
		return -1;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值