2015-12-24 4 views
1

Я хочу создать программу, которая ищет линейку в отсортированном массиве и может выводить различные позиции, в которых найден найденный элемент. На данный момент моя программа выводит только первую позицию, в которой найден элемент поиска, так вот пример из того, что то, что моя программа делает прямо сейчас:Линейный поиск в отсортированном массиве - Java

Enter number of elements 
5 
Enter 5 integers 
1 
3 
3 
9 
15 
Enter value to find 
3 
3 is present at location 2. 

Теперь дело в том, что 3 находится на месте 2 и 3 , и это то, что я хочу редактировать в программе, но я не знаю, как это сделать.

Вот код моей программы:

import java.util.Scanner; 
class LinearSearchArray1 { 
    public static void main(String args[]){ 
     int c, 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(); 

     for (c = 0; c < n; c++) 
     { 
      if (array[c] == search)  /* Searching element is present */ 
      { 
      System.out.println(search + " is present at location " + (c + 1) + "."); 
      break; 
     } 
    } 
    if (c == n) /* Searching element is absent */ 
     System.out.println(search + " is not present in array."); 
    } 
} 
+0

'Arrays.binarySearch' найти первую позицию. Затем цикл, чтобы найти другие - они должны быть вместе в отсортированном массиве. –

ответ

1
... 
System.out.println("Enter value to find"); 
search = in.nextInt(); 

boolean exists = false; 

for (c = 0; c < n; c++) 
{ 
    if (array[c] == search)  /* Searching element is present */ 
    { 
    System.out.println(search + " is present at location " + (c + 1) + "."); 
    exists = true; 
    } 
} 

if (!exists) /* Searching element is absent */ 
    System.out.println(search + " is not present in array."); 

Вы должны удалить break; заявление. В противном случае, как только будет найдено первое значение, цикл будет разбит, & следующие совпадения никогда не будут достигнуты.

+0

OMG на самом деле было так просто, осталась одна проблема: я получаю «3 нет в массиве». в последней строке. – TinaXx

+0

На самом деле вам нужно что-то вроде флага. Проверьте мое редактирование. –

+2

@Sparta Это будет сканировать весь массив каждый раз. Разрыв на следующем не равном значении будет лучше, так как массив отсортирован. (конечно, бинарный поиск был бы предпочтительнее для больших массивов) –

0

Этот код может работать на вас.

int c = 0; 

    while (c < array.length && array[c] < search) 
    { 
     cc++; 
    } 
    int first = c; 
    while (c < array.length && array[c] == search) { 
     c++; 
    } 
    int last = c; 

Теперь элементы между индексами «первый» и «последний» (включая их) содержат искомый номер. Таким образом, вы в основном ищете первый и последний элементы, которые вам нравятся.
Пример написать его утешать:

for (int i = first; i <= last; i++) 
    { 
     System.out.println(search + " is present at location " + (i + 1) + "."); 
    } 
+0

Нет, элемент 'last' НЕ содержит требуемое значение. Фактически, 'last' будет находиться вне массива, если все элементы меньше или равны' search'. Код правильный (за исключением 'cc' вместо' c'), и на самом деле это именно то, что я бы использовал. Однако после кода мы знаем, что есть точно 'last-first' элементы, соответствующие' search' (обратите внимание, что это может быть ноль), и эти элементы находятся между 'first' (включая) и' last' (исключены). Последний 'for' будет работать нормально, если' <= 'были изменены на' ''. Никакие итерации в этом цикле означают, что 'search' не находится в массиве. – Jojonete

0
import java.util.Scanner; 

public class BinarySearch { 
    /* 
    * A binary search or half-interval search algorithm finds the position of a 
    * specified value (the input "key") within a sorted array. Binary search 
    * requires a sorted collection. Also, binary searching can only be applied 
    * to a collection that allows random access (indexing). 
    * 
    * Worst case performance: O(log n) 
    * 
    * Best case performance: O(1) 
    */ 

    public static int binSearch(int a[], int key) { 
     int start = 0; 
     int end = a.length - 1; 

     while (start <= end) { 
      int mid = (start + end)/2; 

      if (key == a[mid]) { 
       return mid; 
      } 
      if (key < a[mid]) { 
       end = mid - 1; 
      } else { 
       start = mid + 1; 

      } 

     } 
     return -1; 

    } 

    public static void main(String arg[]) { 

     BinarySearch bi = new BinarySearch(); 
     int[] arr = { 2, 4, 6, 8, 10, 12, 14, 16 }; 
     System.out.println("Please Key to be search"); 
     Scanner sc = new Scanner(System.in); 
     int input = Integer.parseInt(sc.nextLine()); 

     if (bi.binSearch(arr, input) != -1) { 
      System.out.println(input + ": " + " Search found at " 
        + bi.binSearch(arr, input) + " " + "Position"); 
     } else { 
      System.out.println(input + ": " + " Search Result not found "); 
     } 

    } 
} 
0

Использовать обычные Список_массивов для хранения местоположение: -

импорта java.util.ArrayList; импорт java.util.Scanner;

класс LinearSearchArray1 {

public static void main(String args[]){ 

    int c, n, search, array[]; 
    boolean searchStatus=false; 

    ArrayList<Integer> al=new ArrayList<Integer>(); 

    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(); 
    for (c = 0; c < n; c++) 
    { 
     if (array[c] == search)  /* Searching element is present */ 
     { 
     al.add(c+1); 
     searchStatus=true; 
    } 
} 
if (searchStatus==false) /* Searching element is absent */ 
    System.out.println(search + " is not present in array."); 
else { 
    System.out.print(search+ " is present in array at location "); 
    for(Integer i:al) 
     System.out.print(i+","); 
} 
} 

}

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