java 中二分查找的实现

Implementation of binary search in java

我正在尝试在 Java 中实现二进制搜索。我正在处理最多 100 个素数数组。这是代码:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        binarySearch(new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}, 29, 0, 24);
    }

    public static int binarySearch(int[] sortedArray, int key, int min, int max) {
        int average = (min + max) / 2;

        if (Arrays.asList(sortedArray).contains(key)) {
            if (average == key) {
                System.out.println("You have guessed the right number and it is: " + average);
                return average;
            } else if (key > average) {
                System.out.println("Key is greater than average, going back to loop: " + average);
                return binarySearch(sortedArray, key, average + 1, max);
            } else {
                System.out.println("Key is smaller than average, going back to loop : " + average);
                return binarySearch(sortedArray, key, min, average - 1);
            }
        } else {
            return -1;
        }
    }

我觉得可能是main中对binarySearch的调用有问题,但我不确定用什么方式可以实现。

您可以在 java.util.Collections#binarySearch(java.util.List>, T)

您的代码中存在两个主要问题(如果您 运行 使用调试器处理代码,您可以很容易地解决它们):

  1. if (Arrays.asList(sortedArray).contains(key)) {

    为什么需要这个?此方法的全部目的是搜索密钥,因此您不应调用此代码。此外,此代码不起作用,因为 Arrays.asList(sortedArray) 会 return 一个 List<int[]>NOT 一个 List<int>,它永远不会包含键,所以这个表达式总是 return false.

  2. 您正在将键与列表中的索引进行比较,您应该将其与索引处的 元素 进行比较:

     if (sortedArray[average] == key) {
    

    还有

     } else if (key > sortedArray[average]) {