一、基本查找
public class BasicSearchDemo1 {
public static void main(String[] args) {
//基本查找
//核心:从零索引开始挨个往后查
//需求:定义一个方法利用基本查找,查询某个元素是否存在
//数据如下:{154,121,54,46,23,11,9}
int[] arr={154,121,54,46,23,11,9};
int number = 54;
System.out.println(basicSearch(arr,number));
}
//参数:数组 要查找的元素
//返回值:元素是否存在
public static boolean basicSearch(int arr[],int number) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == number) {
return true;
}
}
return false;
}
}
二、二分查找
前提条件:数组中的数据必须是有序的
核心逻辑:每次排除一半的查找范围
public class BinarySearchDemo2 {
public static void main(String[] args) {
int [ ]arr={4,9,13,26,39,49,79};
System.out.println(binarySearc(arr,13));
}
public static int binarySearc(int arr[],int number){
//1.定义两个变量记录要查找的范围
int min = 0;
int max = arr.length - 1;
//2.利用循环不断的去找要查找的数据
while(true){
if(min > max){
return -1;
}
//3.找到min和max的中间位置
int mid = (min + max) / 2;
//4拿着mid指向的元素跟要查找的元素进行比较
if(arr[mid]>number){
//4.1number在mid的左边
//min不变,max=mid -1;
max = mid - 1;
}else if (arr[mid]<number){
//4.2number在mid的右边
//max不变,min=mid+1;
min = mid + 1;
}else{
//4.3number跟mid指向一样
//找到了
return mid;
}
}
}
}
1.二分法查找的优势:提前查找效率
2.二分法查找的前提条件:数据必须是有序的。如果数据是乱的,先排序再用二分查找得到的索引没有实际意义,只能确定当前数字在数组中是否存在,因为排序后数字的位置就可能发生变化了
3.二分查找的过程:>min和max表示当前要查找的范围 >mid是在min和max中间的 >如果要查找的元素在mid的左边,缩小范围时,min不变,max等于mid减1> 如果要查找的元素在mid的右边,缩小范围时,max不变,min等于mid加1
三、插值查找
mid=min + key-arr[min]/arr[max]-arr[min]*(max-min)
四、斐波那契查找
mid=min+黄金分割点左半边长度-1
总结:
相同点:都是通过不断的缩小范围来查找对应的数据
不同点:计算mid的方式不一样
二分:mid每次都是指向范围的中间位置
插值:mid尽可能的靠近要查找的数据,但是要求数据尽可能的分布均匀
斐波那契:根据黄金分割点来计算mid指向的位置