📜  在Java中的排序数组中搜索相等、更大或更小(1)

📅  最后修改于: 2023-12-03 15:37:36.322000             🧑  作者: Mango

在Java中的排序数组中搜索相等、更大或更小

在Java中,对于已经排好序的数组,我们可以根据需要进行搜索相等值、更大值或更小值。这种搜索很常见,在数据处理、算法和编程中被广泛应用到。本文将介绍在Java中搜索排序数组的算法,包括线性搜索和二分搜索两种方法。

线性搜索

线性搜索是最简单的搜索方法,逐个遍历数组中的每个元素,直到找到目标值。如果数组中没有找到目标值,则返回-1。在已经排序的数组中进行线性搜索是不高效的,因为排序的主要目的就是为了提高搜索性能。因此,如果数组已经排序,我们可以使用更高效的二分搜索方法。

以下是Java中的线性搜索代码示例:

public static int linearSearch(int arr[], int target) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == target)
            return i;
    }
    return -1; //如果未找到,返回-1
}
二分搜索

二分搜索(也称为二分查找)是一种高效的搜索算法,它应用于已经排序的数组中。这个算法的思想非常简单:我们可以将数组划分成两半,然后通过比较目标值和中间元素的大小关系,决定要在左半部分或右半部分继续搜索,然后重复这个过程,直到找到目标值或者确定目标值不存在。

以下是Java中的二分搜索代码示例:

public static int binarySearch(int arr[], int target) {
    int low = 0, high = arr.length - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] == target)
            return mid; //如果找到,返回下标
        else if (arr[mid] < target)
            low = mid + 1; //中间元素比目标小,搜索右半部分
        else
            high = mid - 1; //中间元素比目标大,搜索左半部分
    }
    return -1; //如果未找到,返回-1
}

为了进一步优化,我们可以使用递归来实现二分搜索。以下是使用递归实现的Java代码:

public static int binarySearchRecursion(int arr[], int target, int low, int high) {
    if (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] == target)
            return mid; //如果找到,返回下标
        else if (arr[mid] < target)
            return binarySearchRecursion(arr, target, mid + 1, high); //中间元素比目标小,搜索右半部分
        else
            return binarySearchRecursion(arr, target, low, mid - 1); //中间元素比目标大,搜索左半部分
    }
    return -1; //如果未找到,返回-1
}

在使用递归的实现中,我们需要传递参数low和high,以确定搜索范围。

搜索更大值

在一个已经排序的数组中搜索比目标值大的元素很容易:只需要找到第一个大于目标值的元素,然后返回其下标即可。我们可以利用原始的二分搜索方法实现。以下是Java代码示例:

public static int searchGreater(int arr[], int target) {
    int low = 0, high = arr.length - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] <= target)
            low = mid + 1; //中间元素比目标小或者相等,搜索右半部分
        else {
            if (mid == 0 || arr[mid - 1] <= target)
                return mid; //找到第一个大于目标值的元素,返回下标
            else
                high = mid - 1; //中间元素比目标大,搜索左半部分
        }
    }
    return -1; //未找到比目标值更大的元素,返回-1
}

从代码可以看出,如果我们找到一个中间元素比目标值小或相等的元素,就更新low的值以搜索右半部分。否则,我们可以检查前一个元素是不是比目标值小或相等,如果是,说明前一个元素就是我们要找的第一个比目标值大的元素,我们可以返回其下标。否则,我们需要在左半部分继续搜索。

搜索更小值

同样,在一个已经排序的数组中搜索比目标值小的元素也很容易:只需要找到最后一个小于目标值的元素,然后返回其下标即可。以下是Java代码示例:

public static int searchSmaller(int arr[], int target) {
    int low = 0, high = arr.length - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] >= target)
            high = mid - 1; //中间元素比目标大或者相等,搜索左半部分
        else {
            if (mid == arr.length - 1 || arr[mid + 1] >= target)
                return mid; //找到最后一个小于目标值的元素,返回下标
            else
                low = mid + 1; //中间元素比目标小,搜索右半部分
        }
    }
    return -1; //未找到比目标值更小的元素,返回-1
}

同样,如果我们找到一个中间元素比目标值大或相等的元素,就更新high的值以搜索左半部分。否则,我们可以检查后一个元素是不是比目标值大或相等,如果是,说明后一个元素就是我们要找的最后一个比目标值小的元素,我们可以返回其下标。否则,我们需要在右半部分继续搜索。

以上是在Java中排序数组中搜索相等、更大或更小的算法和代码介绍。这些搜索算法在各种数据处理、算法和编程问题中很有用,尤其是当我们需要对已经排好序的数组进行搜索时。