📅  最后修改于: 2023-12-03 15:37:36.322000             🧑  作者: Mango
在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中排序数组中搜索相等、更大或更小的算法和代码介绍。这些搜索算法在各种数据处理、算法和编程问题中很有用,尤其是当我们需要对已经排好序的数组进行搜索时。