Java 交互式和递归式二叉搜索

Harshit Jindal 2023年10月12日
  1. 二叉搜索算法的迭代实现
  2. Java 二叉搜索的迭代程序
  3. 递归二叉搜索算法
  4. Java 二叉搜索的递归程序
  5. Arrays.binarySearch() 概述
  6. Java 二叉搜索程序
Java 交互式和递归式二叉搜索
注意
如果你想详细了解二叉搜索,那么可以参考二叉搜索算法一文。

二叉搜索算法的迭代实现

假设我们有一个未排序的数组 A[],包含 n 个元素,我们想找到一个元素 X

  • lo0hin - 1
  • lo< hi
    • 设置 mid=lo + (hi - lo)/2
    • 如果 A[mid] == X,我们找到了元素,返回索引 mid
    • 如果 A[mid] < X,则丢弃左半部分元素,并将 lo 设为 mid+1
    • 否则,如果 A[mid] > X,则丢弃右半部分元素,并将 hi 设为 mid-1
  • 未找到元素,所以返回 -1

Java 二叉搜索的迭代程序

class BinarySearch {
  int binarySearch(int arr[], int x) {
    int lo = 0, hi = arr.length - 1;
    while (lo <= hi) {
      int mid = lo + (hi - lo) / 2;

      if (arr[mid] == x)
        return mid;

      if (arr[mid] < x)
        lo = mid + 1;

      else
        hi = mid - 1;
    }
    return -1;
  }

  public static void main(String args[]) {
    BinarySearch ob = new BinarySearch();
    int arr[] = {1, 2, 3, 4, 5};
    int n = arr.length;
    int x = 5;
    int position = ob.binarySearch(arr, x);
    if (position == -1)
      System.out.println("Element not present");
    else
      System.out.println("Element found at index: " + position);
  }
}

输出:

Element found at index: 4

递归二叉搜索算法

假设我们有一个无序数组 A[],包含 n 个元素,我们想找到一个元素 X

  • 初始化 lo0hin-1
  • 如果 lo>hi,说明我们已经用尽了数组的搜索空间,返回-1。
  • 计算中点 midlo+(hi-lo)/2。它将数组分为两部分:下半部分是 0mid - 1 的元素,上半部分是 midn - 1 的元素。
  • 如果 X=mid,我们发现目标元素返回 mid
  • 如果 X 小于 mid,通过递归调用 binarysearch(arr, lo, mid-1) 搜索数组的下半部分。
  • Else 如果 X 大于 mid,则通过递归调用 binarysearch(arr, mid+1, hi) 来搜索数组的上半部分。

Java 二叉搜索的递归程序

class BinarySearch {
  int binarySearch(int arr[], int lo, int hi, int x) {
    if (hi >= lo && lo < arr.length - 1) {
      int mid = lo + (hi - lo) / 2;
      if (arr[mid] == x)
        return mid;
      if (arr[mid] > x)
        return binarySearch(arr, lo, mid - 1, x);
      return binarySearch(arr, mid + 1, hi, x);
    }
    return -1;
  }
  public static void main(String args[]) {
    BinarySearch ob = new BinarySearch();
    int arr[] = {1, 2, 3, 4, 5};
    int n = arr.length;
    int x = 2;
    int position = ob.binarySearch(arr, 0, n - 1, x);
    if (position == -1)
      System.out.println("Element not found !!!");
    else
      System.out.println("Element found at index: " + position);
  }
}

输出:

Element found at index: 1

Arrays.binarySearch() 概述

Java 为我们提供了一个现成的函数 Arrays.binarySearch(),这样我们就不用自己去实现这个函数了。它是一个非常简单易用且有效实现的方法,而且不容易出错。

语法

public static int binarySearch(T arr, T key)

T 可以是下列任何一种。int, float, short, long, byte, char, double, 甚至还有用户定义的 Object

就像我们实现的二叉搜索一样,它也要求对数组进行排序,否则结果是无法定义的。它使用二叉搜索算法对数组进行搜索,找到目标元素的索引。如果目标元素有多个出现,那么它可以返回其中任何一个元素的索引。

参数

Arr 输入数组
Key 我们要搜索的目标元素。

返回值

如果它找到了目标元素,那么就返回它的索引,否则就返回 beg - 1,其中 beg 是数组搜索空间的起始索引。否则,它返回 beg - 1,其中 beg 是数组搜索空间的起始索引。

Java 二叉搜索程序

import java.util.Arrays;

class BinarySearchExample {
  public static void main(String args[]) {
    int arr[] = {1, 2, 3, 4, 5};
    int key = 2;
    int result = Arrays.binarySearch(arr, key);
    if (result < 0)
      System.out.println("Element is not found!");
    else
      System.out.println("Element is found at index: " + result);
  }
}

输出:

Element is found at index: 1
作者: Harshit Jindal
Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

相关文章 - Java Algorithm