Java数组二进制搜索

Java数组二进制搜索,java,arrays,binary-search,Java,Arrays,Binary Search,好的,伙计们,这是我的一段简单代码,我构建了一个字符串数组,并尝试在该数组中搜索字符串: String[] arr = new String[5]; arr[0] = "ccc"; arr[1] = "aaa"; arr[2] = "bbb"; arr[3] = "eee"; arr[4] = "ddd"; System.out.println(Arrays.binarySearch(arr,"eee")); 直接取自Java6BinarySearch文档:“在进行此调用之前,必须对数组进行

好的,伙计们,这是我的一段简单代码,我构建了一个字符串数组,并尝试在该数组中搜索字符串:

String[] arr = new String[5];
arr[0] = "ccc";
arr[1] = "aaa";
arr[2] = "bbb";
arr[3] = "eee";
arr[4] = "ddd";

System.out.println(Arrays.binarySearch(arr,"eee"));
直接取自Java6BinarySearch文档:“在进行此调用之前,必须对数组进行排序。如果未排序,则结果未定义”

实际上,我运行了几次代码,得到的输出总是3,这是eee在未排序数组中的位置,但正如文档所说,结果似乎不是“未定义的”

我错过了什么

谢谢

您遗漏了“结果未定义”包括“正确”答案的可能性,如本例所示


如果您将arr[1]更改为“eee”,您将看到不同的结果。

未定义“并不意味着“肯定会给您错误的结果”,或“肯定会崩溃”。

许多机构、书籍、教授定义的二进制搜索。。。等要求元素以字母或数字的方式排序

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    String[] arr = new String[6];
    arr[0] = "ccc";
    arr[1] = "aaa";
    arr[2] = "bbb";
    arr[3] = "eee";
    arr[4] = "ddd";
    arr[5] = "aaa";
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
  }
}

除了esej的答案之外,下面是对您的程序的修改,它返回了错误的答案:

public class Main {
    public static void main(String[] args) {
        String[] arr = new String[6];
        arr[0] = "ccc";
        arr[1] = "aaa";
        arr[2] = "bbb";
        arr[3] = "eee";
        arr[4] = "ddd";
        arr[5] = "aaa";

        System.out.println(Arrays.binarySearch(arr, "eee"));
    }
}

当我们谈论一段代码将如何运行时,术语“未定义”意味着程序执行可以执行以下任一操作:

  • 返回错误的答案
  • 永远循环
  • 立即崩溃
  • 损坏某些数据并在很久以后导致崩溃
  • 执行其他非预期操作(例如,擦除硬盘驱动器)
  • 幸运的话,返回正确的答案
作为对程序员的建议,不要调用未定义的行为,因为任何事情都可能发生,无论是好的还是坏的,现在还是将来

“未定义”表示算法将在数组上运行,但结果不能保证正确(二进制搜索强烈需要排序数组才能工作)。您的示例之所以有效,是因为发生了以下情况:

  • 输入二进制搜索,first=0,last=4,middle=2比较
  • 带“eee”的数组[中间](“bbb”第一个=2+1;中间=3
  • 将数组[middle]与“eee”=>“found”进行比较;返回3

换句话说,数组大小从5更改为6。相反,它的意思是“可以是任何东西,我们不指定它是什么。”周二可能会有所不同,或者外面阳光明媚,或者你母亲今天的感受:没有指定。