import java.io.*;
import java.lang.Integer;
class sort {
public void find(int val, int a[], int n) {
int mid = n / 2;
System.out.println("the mid value is:" + a[mid]);
if (a[mid] == val) {
System.out.println("found " + a[mid] + " in position " + mid);
} else if (a[mid] < val) {
for (int i = mid; i < n; i++) {
if (a[mid] == val) {
System.out.println("found" + val);
}
}
} else if (a[mid] > val) {
for (int i =0; i < mid; i++) {
if (a[mid] == val) {
System.out.println("found" + val);
}
}
}
}
public static void main(String args[])throws IOException {
DataInputStream in = new DataInputStream(System.in);
int temp;
int a[] = new int[100];
System.out.println("enter the nos of elements");
int n = Integer.parseInt(in.readLine());
for (int i =0; i < n; i++) {
a[i] = Integer.parseInt(in.readLine());
}
for (int i =0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (int i =0; i < n; i++) {
System.out.println(a[i]);
}
System.out.println("enter the value to be searched");
int val = Integer.parseInt(in.readLine());
sort s = new sort();
s.find(val, a, n);
}
}
使用上面的代码,我想从使用二进制搜索的现有数组列表中找到用户定义的值。它仅检查中间值,而不检查更高或更低的值。
我认为循环无效。
请找到解决方案。
答案 0 :(得分:4)
你的两个内环:
for(int i=mid;i<n;i++)
{
if (a[mid] ==val)
System.out.println("found"+val);
}
for(int i=0;i<mid;i++)
{
if ( a[mid] ==val)
System.out.println("found"+val);
}
请注意,您正在访问a[mid]
。 mid
在整个循环中不会改变;你打算用a[i]
。尝试将mid
替换为i
。
此外,您可能希望查看缩进代码。您使用什么编辑器编写代码?
答案 1 :(得分:0)
修改你的find()函数如下,以递归方式找到搜索下的值,实际上可以称之为二进制搜索 -
public void find(int val, int a[], int startIndex, int endIndex) {
if(endIndex-startIndex == 1) {
System.out.println("Not found");
return;
}
int mid = startIndex + ((endIndex-startIndex) / 2);
System.out.println("the mid value is:" + a[mid]);
if (a[mid] == val) {
System.out.println("found " + a[mid] + " in position " + mid);
} else {
if(a[mid] > val) {
find(val, a, startIndex, mid);
} else {
find(val, a, mid, endIndex);
}
}
}
您可以将函数调用为startIndex为零,将endIndex调用为数组长度减去1。
答案 2 :(得分:0)
我可以建议在再次调用这些位置定义的分区之前检查极值位置值吗?