线性和二进制搜索逻辑错误
Posted
技术标签:
【中文标题】线性和二进制搜索逻辑错误【英文标题】:Linear and Binary search logical error 【发布时间】:2014-11-16 06:28:06 【问题描述】:我正在开发一个程序,我必须在其中演示线性和二进制搜索算法的工作原理。为此,我接受了一个包含 20 个数字的数组和来自用户的搜索键。代码编译,并且没有抛出运行时错误。但是,当我在数组中搜索一个数字(例如 12)时,不是打印在位置 12 中找到该数字,而是在位置 6 中找到该数字:
import java.util.*;
class prg14
int num [] = new int [20];
int search;
public void lin (int arr[], int a)
num = arr;
search = a;
int i;
int flag = 0;
for (i=0; i<num.length; i++)
if (search == num[i])
flag = 1;
break;
if (flag == 1)
System.out.println("Linear Search : ");
System.out.println(a+ " found at position " + (i + 1));
else
System.out.println("Linear Search : ");
System.out.print(a+ " not present in the list \n");
public void binary(int array[], int a)
int first = 0;
int n = 20;
int last = n - 1;
int middle = (first + last)/2;
while( first <= last )
if ( array[middle] < search )
first = middle + 1;
else if ( array[middle] == search )
System.out.println("Binary search : ");
System.out.println(search + " found at position " + (middle+1) + ".");
break;
else
last = middle - 1;
middle = (first + last)/2;
if ( first > last )
System.out.println("Binary Search : ");
System.out.println(search + " not present in the list.\n");
public static void main(String args[])
Scanner sc = new Scanner(System.in);
prg14 obj = new prg14();
System.out.println("Enter any 20 numbers.");
String str;
int linn[] = new int[20];
int i;
for( i = 0; i<10; i++)
str = sc.next();
linn[i] = sc.nextInt();
System.out.println("Enter number to be searched.");
int search = sc.nextInt();
obj.lin(linn, search);
obj.binary(linn, search);
我该如何解决这个问题? TIA。
【问题讨论】:
您确定值 12 不在位置 6 上吗?为什么只读取 10 个值? 二进制搜索适用于已排序的数组。您确定输入是以排序方式输入的吗? 还有一点,"if (array[middle] == search) ... print "found at middle+1" -- 为什么是 +1? -- 但是从 if 语句 array[middle ] 必须等于搜索,所以无论打印什么都是正确的(减 1) 是的,输入的输入已排序。是的,值 12 不在位置 6。但是,只读取 10 个值是有问题的。我会改变的。 @ElliottFrisch 我将 main 方法中的 for 循环更改为读取 20 个值。但是,程序现在要求用户提供 40 个值。 【参考方案1】:删除String str
,点赞
for( i = 0; i<linn.length; i++)
// str = sc.next();
linn[i] = sc.nextInt();
您没有混合行输入和标记化输入,因此您无需担心尾随换行符(在这种情况下)。此外,我将通过返回匹配索引(如果未找到则返回 -1)来实现线性搜索功能
public static int linear(int arr[], int a)
for (int pos = 0; pos < arr.length; pos++)
if (arr[pos] == a)
return pos;
return -1;
我会为 binarySearch 做同样的事情。这样您就可以将消息显示与计算分开。
【讨论】:
你也不需要将数组值分配给类成员变量,这里最好作为静态实用方法而不是给它一个状态以上是关于线性和二进制搜索逻辑错误的主要内容,如果未能解决你的问题,请参考以下文章