Java中的二进制搜索
时间:2020-02-23 14:36:09 来源:igfitidea点击:
介绍
在本教程中,我们将学习二进制搜索算法并将其用Java实现。
常规线性或者顺序搜索算法可方便地用于少量数据。
当大小增加时,在最坏的情况下,我们需要进行2n次比较,其中数组或者列表的大小为n。
因此,我们需要更有效的算法来搜索元素。
在本教程中,我们将探讨二进制搜索是一种简单而有效的算法,以及它是如何工作的。
二元搜索的核心算法
对于二进制搜索,数组中的元素必须按排序顺序。
让我们考虑一个升序的数组。
二进制搜索将要搜索的元素(即关键字)与数据集中中间的元素进行比较。
它基于以下三个(3)基本条件:
- 如果键小于中间元素,那么我们现在只需要在数组的前半部分搜索,
- 如果键大于中间元素,那么我们只需要在数组的后半部分搜索,
- 如果键等于数组中的中间元素,则搜索结束,
- 最后,如果未在整个数组中找到键,则应返回none或者-1。
这表明不存在要搜索的元素。
二进制搜索示例
考虑一个由10个整数组成的排序数组,如下所示,
给定数组
假设我们正在搜索元素48。
在这种情况下,我们的键是48。
现在,我们将比较中间元素(即25)与我们需要搜索的元素(48)。
从" 48> 25"开始,我们消除了前半部分,因此必须在后半部分中搜索密钥。
为此,我们将低设置为Mid + 1,将高设置为数组的大小– 1或者最后一个元素的索引。
在下一次迭代中,我们将中间元素55与键进行比较。
从" 48 <55"开始,我们将不得不在数组的左半部分再次搜索元素。
相应地,low和high的值更新为5(不变)和Mid – 1。
接下来,现在中间元素是28,因此我们具有48> 28
。
因此,我们需要进一步考虑数组的正确部分。
现在,低=中+ 1 = 6,高= 6(无变化)。
对于下一次迭代,中间元素等于要搜索的元素,即48。
因此,我们在索引6(中)找到了该数字。
用Java实现二进制搜索
现在让我们在Java中实现上述二进制搜索算法。
public class BinarySearch { public static int binarySearch(int arr[], int low, int high, int key) { int mid = (low + high)/2; while( low <= high ) { if ( arr[mid] < key ) { low = mid + 1; } else if ( arr[mid] == key ) { return mid; }else { high = mid - 1; } mid = (low + high)/2; } if ( low > high ) { return -1; } return -1; } public static void main(String args[]) { int arr[] = {10,18,19,20,25,28,48,55,62,70}; int key = 48; int n=arr.length-1; int index = binarySearch(arr,0,n,key); System.out.println("The sorted array is: "); for(int i=0;i<n;i++) { System.out.print(arr[i] + " "); } System.out.println("\nElement to be searched: "+key); if (index == -1) System.out.println("Unfortunately the Element is not found!"); else System.out.println("The Element is found at the index: "+index); } }
二进制搜索算法的复杂性
二进制搜索算法的平均比较数为log2N。
因此,二进制搜索的时间复杂度为log2n。
就空间复杂度而言,对于二进制搜索,它是O(log n)。
另外,存储阵列需要O(n)空间。
其中n是给定排序数组的大小。