2014-11-16 3 views
0

Я работаю над программой, где я должен продемонстрировать работу алгоритма линейного и двоичного поиска. Для этого я получаю массив из 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); 

    } 

} 

Как решить Эта проблема? ТИА.

+0

Вы уверены, что значение 12 не находится в местоположении 6? Почему вы читаете только 10 значений? –

+0

Binary Search работает в отсортированном массиве. Вы уверены, что ввод введен в порядке? – BatScream

+0

И еще один момент: «if (array [middle] == search) ... print« found at middle + 1 »- why +1? - Но из этого массива if [middle] должен быть равен поиску, так что независимо от того, что он печатает, правильно (минус 1) – Ben

ответ

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. Таким образом вы можете отделить отображение сообщений от расчета.

+0

также вам не нужно присваивать значение массива переменным класса, он лучше устанавливается как статический метод утилиты здесь вместо того, чтобы дать ему состояние –

 Смежные вопросы

  • Нет связанных вопросов^_^