下面是使用 Java 实现的四种查找算法:
- 线性查找(Linear Search)
- 二分查找(Binary Search)
- 插值查找(Interpolation Search)
- 斐波那契查找(Fibonacci Search)
✅ 1. 线性查找(Linear Search)
说明:
从数组的第一个元素开始,逐个比较,直到找到目标值或遍历完整个数组。
Java 实现:
public class LinearSearch {
public static int linearSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i; // 返回索引
}
}
return -1; // 未找到
}
public static void main(String[] args) {
int[] arr = {4, 2, 7, 1, 9, 3};
int target = 7;
System.out.println("Index of " + target + ": " + linearSearch(arr, target)); // 输出 2
}
}
✅ 2. 二分查找(Binary Search)
说明:
适用于有序数组。每次将查找区间缩小一半,效率高,时间复杂度为 O(log n)。
Java 实现:
public class BinarySearch {
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11};
int target = 7;
System.out.println("Index of " + target + ": " + binarySearch(arr, target)); // 输出 3
}
}
✅ 3. 插值查找(Interpolation Search)
说明:
是对二分查找的优化,适用于数据分布均匀的有序数组。通过插值公式计算中间点,平均性能优于二分查找。
Java 实现:
public class InterpolationSearch {
public static int interpolationSearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right && target >= arr[left] && target <= arr[right]) {
int pos = left + ((target - arr[left]) * (right - left)) / (arr[right] - arr[left]);
if (arr[pos] == target) {
return pos;
} else if (arr[pos] < target) {
left = pos + 1;
} else {
right = pos - 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int target = 60;
System.out.println("Index of " + target + ": " + interpolationSearch(arr, target)); // 输出 5
}
}
✅ 4. 斐波那契查找(Fibonacci Search)
说明:
基于斐波那契数列对数组进行分割,也是一种适用于有序数组的查找算法,平均性能与二分查找相当,但减少除法运算,在某些硬件环境下效率更高。
Java 实现:
public class FibonacciSearch {
public static int fibonacciSearch(int[] arr, int target) {
int n = arr.length;
int[] fib = new int[20];
fib[0] = 0;
fib[1] = 1;
int i = 1;
while (fib[i] < n) {
fib[++i] = fib[i - 1] + fib[i - 2];
}
int offset = 0;
while (fib[i] > 1) {
int k = Math.min(offset + fib[i - 2], n - 1);
if (arr[k] < target) {
offset = k;
fib[i] = fib[i - 1];
fib[i - 1] = fib[i - 2];
i--;
} else if (arr[k] > target) {
fib[i] = fib[i - 2];
fib[i - 1] = fib[i - 1] - fib[i - 2];
i--;
} else {
return k;
}
}
if (fib[i - 1] == 1 && arr[offset + 1] == target) {
return offset + 1;
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15};
int target = 9;
System.out.println("Index of " + target + ": " + fibonacciSearch(arr, target)); // 输出 4
}
}
✅ 查找算法对比表
查找算法 | 数据要求 | 时间复杂度 | 空间复杂度 | 特点 |
---|---|---|---|---|
线性查找 | 无序数组 | O(n) | O(1) | 简单,适合小数据量 |
二分查找 | 有序数组 | O(log n) | O(1) | 高效,常用 |
插值查找 | 有序数组(分布均匀) | O(log log n) ~ O(n) | O(1) | 数据均匀时性能更好 |
斐波那契查找 | 有序数组 | O(log n) | O(1) | 避免除法,适合特定环境 |
✅ 总结
- 线性查找:最简单,但效率低,适合小数据或无序数组。
- 二分查找:最常用,适用于有序数组,效率高。
- 插值查找:适用于数据分布均匀的场景,性能优于二分查找。
- 斐波那契查找:减少除法操作,适合某些硬件环境,实现稍复杂。
在实际开发中,根据数据是否有序、数据分布、性能需求等选择合适的查找算法。