实现二进制搜索

时间:2010-07-18 05:38:45

标签: java

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);
    }
}

使用上面的代码,我想从使用二进制搜索的现有数组列表中找到用户定义的值。它仅检查中间值,而不检查更高或更低的值。

我认为循环无效。

请找到解决方案。

3 个答案:

答案 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)

我可以建议在再次调用这些位置定义的分区之前检查极值位置值吗?