14-常见算法
基本查找/顺序查找
- 从0索引依次向后查找
二分查找/折半查找
- 前提条件:数组中的数据必须是有序的
- 核心逻辑:每次排除一半的查找范围


package io.xiaoduo.arithmetic;
public class Test1 {
public static void main(String[] args) {
int[] arr = {
1, 12, 24, 35, 43, 52, 64, 75, 87, 99, 100};
System.out.println(binarySearch(arr, 75)); // 7
}
// 二分查找
private static int binarySearch(int[] arr, int num) {
int min = 0;
int max = arr.length - 1;
while (true) {
if (min > max) {
return -1;
}
int mid = (min + max) / 2;
if (arr[mid] > num) {
max = mid - 1;
} else if (arr[mid] < num) {
min = mid + 1;
} else {
return mid;
}
}
}
}
总结
- 二分查找的优势
- 提高查找效率
- 二分查找的前提条件
- 数据必须是有序的,如果数据是乱的,先排序再使用二分查找得到的索引没有实际意义,只能确定当前数字在数组中是否存在,因为排序之后的数字位置已经发生改变
- 二分查找的过程
- min和max表示当前要查找的范围
- mid是在min和max中间的
- 如果要查找的元素在mid的左边,缩小范围时,min不变,max等于mid减一
- 如果要查找的元素在mid的右边,缩小范围是,max不变,min等于mid加一
二分查找改进/插值查找

二分查找改进/斐波那契查找

分块查找
- 核心思想:块内无序,块间有序


package io.xiaoduo.arithmetic;
public class Test2 {
public static void main(String[] args) {
// 分块查找
int[] arr = {
7, 10, 13, 19, 16, 20, 27, 22, 30, 40, 36, 43, 50, 48};
// 第一步分块
Block b1 = new Block(10, 0, 1);
Block b2 = new Block(20, 2, 5);
Block b3 = new Block(40, 6, 10);
Block b4 = new Block(50, 11

1344

被折叠的 条评论
为什么被折叠?



