问:我在网上找到了它,我想知道它的算法解释。我很难理解这一点。非常感谢 :)
import java.util.Scanner;
class BinarySearch
{
public static void main(String args[])
{
int c, first, last, middle, n, search, array[];
Scanner in = new Scanner(System.in);
System.out.println("Enter number of elements");
n = in.nextInt();
array = new int[n];
System.out.println("Enter " + n + " integers");
for (c = 0; c < n; c++)
array[c] = in.nextInt();
System.out.println("Enter value to find");
search = in.nextInt();
first = 0;
last = n - 1;
middle = (first + last)/2;
while( first <= last )
{
if ( array[middle] < search )
first = middle + 1;
else if ( array[middle] == search )
{
System.out.println(search + " found at location " + (middle + 1) + ".");
break;
}
else
last = middle - 1;
middle = (first + last)/2;
}
if ( first > last )
System.out.println(search + " is not present in the list.\n");
}
}
答:您提供的程序对给定的元素执行二进制搜索。
二元搜寻
这是复杂度为(log n)的搜索算法之一,它基于分而治之的原理。数据应采用排序形式,以便该算法起作用。
它首先搜索中间元素。如果找到了所需的元素,则它将返回该元素。如果中间元素大于该元素,则在左侧子阵列上执行搜索,否则在右侧子阵列上执行搜索。
这个怎么运作?
第一个条件是数组应采用排序形式。我们将借助示例进行查看,在该示例中我们将在给定数组中搜索17。
3 6 8 9 11 12 14 17 20 65
1)我们使用以下公式计算数组的中间值:
middle =(low + high)/ 2
low =数组的下标,在此为0。
high =数组的较高索引,即9。
这里是(0 + 9)/ 2 = 4(int值为4.5)。
所以4是这里的中间索引值
3 6 8 9 11 12 14 17 20 65
第4个索引的值为11。
现在,我们将11与所搜索的值进行比较。即17。这两个值不匹配。现在我们将比较它们,因为11 <17,这意味着如果正确的子数组将找到我们的值
为此,我们将低端更改为中+1,然后再次重复相同的操作。
低=中+ 1中=(低+高)/ 2这是新的数组。
3 6 8 9 11
12 14 17 20 65
中间=(5 + 9)/ 2 =第七名。我们现在的新年龄是17岁。
现在,我们将再次比较需要搜索的值和该值。由于值匹配,我们将返回元素的位置。
即Middle + 1,即(7 + 1)= 8。
因此它将返回“在第8个位置找到元素”。
如果仍然找不到它,那么我们将继续重复同一件事,直到找到我们的值为止;如果找不到,我们将为此返回适当的消息。
这种搜索技术比线性搜索更好,因为它减少了在数组中查找给定项所需进行的比较的次数。