希赛考试网
首页 > 软考 > 软件设计师

二分查找算法Java

希赛网 2024-02-21 12:10:22

二分查找,也称折半查找,是一种常见的查找算法,它的优点是比较次数少,查找速度快,因此被广泛应用于各种场景,例如在搜索引擎中查找关键词或者在有序数组中进行快速查找。本文将围绕着二分查找算法在Java中的实现进行分析。

一、算法思想

在介绍算法实现之前,首先来了解一下算法的思想。二分查找算法的基本思想是,对于已经排好序的数组,每次找到数组的中间位置,然后将要查找的值与中间值进行比较,如果相等,则返回中间位置;如果要查找的值比中间值小,则在左半部分继续查找;如果要查找的值比中间值大,则在右半部分继续查找,如此递归进行查找,直到找到为止。

二、算法实现

接下来,我们将通过Java代码来实现二分查找算法。假设我们有一个有序数组arr,要查找的值为key,可以先获取数组的左右端点left和right,然后计算出数组的中间位置mid,判断key与arr[mid]的大小关系,如果两者相等,则返回mid;如果key小于arr[mid]的值,说明key在数组左半部分,我们对左半部分递归进行二分查找;如果key大于arr[mid]的值,说明key在数组右半部分,我们对右半部分递归进行二分查找。具体实现代码如下:

```

public static int binarySearch(int[] arr, int key, int left, int right) {

if (left > right) {

return -1;

}

int mid = (left + right) / 2;

if (arr[mid] == key) {

return mid;

} else if (arr[mid] < key) {

return binarySearch(arr, key, mid + 1, right);

} else {

return binarySearch(arr, key, left, mid - 1);

}

}

```

三、算法优化

虽然二分查找算法已经优点明显,但是我们仍然可以对其进行一些优化,提高算法的效率。以下是三个算法优化的方法:

1. 使用位运算代替除法运算

在计算数组的中间位置mid时,原来的方法是将left和right相加,再除以2,但是除法运算比较费时,因此我们可以将除以2的操作改为右移1位的操作,例如mid = (left + right) >> 1。

2. 用非递归方式实现

递归方式实现二分查找算法比较简单,但是递归的过程会消耗更多的栈空间,因此我们可以使用循环的方式来实现二分查找算法,例如以下代码:

```

public static int binarySearch(int[] arr, int key) {

int left = 0;

int right = arr.length - 1;

while (left <= right) {

int mid = (left + right) >> 1;

if (arr[mid] == key) {

return mid;

} else if (arr[mid] < key) {

left = mid + 1;

} else {

right = mid - 1;

}

}

return -1;

}

```

3. 多线程查找

当数组比较大时,可以将数组划分为多个子数组,再使用多线程对每个子数组进行查找,提高查找速度。

四、算法时间复杂度

最后,让我们来看一下二分查找算法的时间复杂度。由于每次查找后,要么查找到了要找的值,要么把数组一分为二,因此每次查找都将数组缩小一半。因此,算法的时间复杂度为O(log n),其中n为数组的大小。

微信扫一扫,领取最新备考资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考报考咨询

微信扫一扫,定制学习计划