Линейный поиск, возвращающий, не найден, когда это должно возвратить номер индекса - PullRequest
0 голосов
/ 20 декабря 2011

Я работаю над домашним заданием для Java, где программа должна прочитать от пользователя 10 цифр, а затем запросить номер для поиска. Он сортирует числа (по возрастанию) и выполняет линейный поиск в массиве, затем должен либо вернуть индекс, в котором он был найден, либо сообщение о том, что он не найден.

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

Вот код.

package program11;
import java.util.Scanner;

public class ArraySearch {

    public static void main(String[] args) {
        double[] arrayBuild = new double[10];
        Scanner input = new Scanner(System.in);

        for (int i = 0; i < arrayBuild.length; i++) {
            System.out.print("Enter a number.");
            arrayBuild[i] = input.nextDouble();
        }

        System.out.print("Enter a number to search for ");
        int objective = input.nextInt();

        linearCheck(arrayBuild, objective);

        if ((objective >= 0) && (objective < arrayBuild.length)) {
            System.out.println("Found at index: " + objective);
        } else {
            System.out.println("Not Found");
        }
    }

    public static void arraySort(double[] arrayBuild) {
        for (int i = 1; i < arrayBuild.length; i++) {
            double currentPoint = arrayBuild[i];
            int r;
            for (r = i - 1; r >= 0 && arrayBuild[r] > currentPoint; r--) {
                arrayBuild[r + 1] = arrayBuild[r];
            }
            arrayBuild[r + 1] = currentPoint;
        }
    }

    public static double linearCheck(double[] arrayBuild, int objective) {
        for (int i = 0; i < arrayBuild.length; i++) {
            if (objective == arrayBuild[i])
                return i;
        }
        return -1;
    }

}

РЕДАКТИРОВАТЬ- новый код. Теперь все завершено, за исключением того, что когда я ввожу число, которого нет в массиве, я получу отрицательный результат. Например, ввод 10 8 7 6 5 3 5 3 5 3 5 6 и поиск 11 дает мне результат -1 для линейного поиска и -11 для двоичного поиска. Я принял ваш совет, как мог. Чего мне не хватает сейчас?

package program11;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class ArraySearch {

    public static void main(String[] args) {
        double[] arrayBuild = new double[10];
        Scanner input = new Scanner(System.in);
        int reply = 2;

for (int i = 0; i < arrayBuild.length; i++) {
    System.out.print("Enter a number.");
    arrayBuild[i] = input.nextDouble();
        }
while (reply != 1) {
        System.out.print("Enter a number to search for ");
        double objective = input.nextDouble();

arraySort(arrayBuild);
        double linearResult = linearCheck(arrayBuild, objective);

if (objective >= 0) {
        System.out.println("Linear search found at index: " + linearResult);
                }
else {
        System.out.println("Not Found (linear)");
        }
        double binaryResult = binaryCheck(arrayBuild, objective);

if (objective >= 0) {
System.out.println("Binary search found at index: " + binaryResult);
                }
else {
     System.out.println("Not Found (binary)");
        }
reply = JOptionPane.showConfirmDialog(null, "Continue?"); 
    }
}

public static void arraySort(double[] arrayBuild) {
    for (int i = 1; i < arrayBuild.length; i++) {
        double currentPoint = arrayBuild[i];
        int r;
        for (r = i - 1; r >= 0 && arrayBuild[r] > currentPoint; r--) {
            arrayBuild[r + 1] = arrayBuild[r];
        }
        arrayBuild[r + 1] = currentPoint;
    }
    }

public static double linearCheck(double[] arrayBuild, double objective) {
    for (int i = 0; i < arrayBuild.length; i++) {
        if (objective == arrayBuild[i])
            return i;
    }
return -1;
    }
public static double binaryCheck(double[] arrayBuild, double objective) {
    int low = 0;
    int high = arrayBuild.length - 1;

    while (high >= low) {
        int mid = (low + high) / 2;
        if (objective < arrayBuild[mid])
            high = mid - 1;
        else if (objective == arrayBuild[mid])
            return mid;
        else
        low = mid + 1;
    }
return -low - 1;
    }
}

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

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

  1. Если вы хотите искать Ints, я бы также сделалarrayBuild типа int.Или вы можете искать двойники, изменив тип objective на удвоение и заставив пользователя ввести двойное значение

  2. При вызове linearCheck вы нигде не сохраняете результатВы должны присвоить его переменной

    double foundLocation = linearCheck(arrayBuild, objective);
    
  3. Ваше утверждение if не имеет особого смысла, вам следует использовать возвращаемое значение linearCheck следующим образом

    if (foundLocation >= 0) {
        System.out.println("Found at index: " + foundLocation);
    } else {
        System.out.println("Not Found");
    }
    
  4. Вы не звоните arraySort нигде в своей основной

1 голос
/ 20 декабря 2011

Вы никогда не сохраняете ценность своего поиска. Ваша цель не совпадает с вашим результатом. Вот изменение кода, которое я бы сделал:

    int result = linearCheck(arrayBuild, objective);

    if ((result >= 0) && (result < arrayBuild.length)) {
        System.out.println("Found at index: " + result);
    } else {
        System.out.println("Not Found");
    }

Это изменение требует, чтобы вы возвращали int для вашей процедуры линейной проверки.

это дополнительно делает objective двойным, а не целым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...