基本查找
核心思路: 从0索引开始挨个往后查找,所以需要一个容器,像是数组或者是集合,这类可以去遍历的容器
二分查找
前提条件:数组中的数据必须是有序的,核心逻辑:每次排除一半的查找范围
1.基本查找
实例
public static void main(String[] args) {
//基本查找/顺序查找
//核心思路
//从0索引开始挨个往后查找
//需求:定义一个方法利用基本查找,查询某个元素是否存在
//数据如下:{123,123,535,56,334,7,56,87,79}
int arr1[] = {123,123,535,56,334,7,56,87,79};
int num = 56;
System.out.println( jbcz(arr1,num));
}
public static boolean jbcz(int arr[],int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == num){
return true;
}
}
return false;
}
}
2.二分查找/折半查找
前提条件:数组中的数据必须是有序的,如果数据是乱斗,先排序再用二分查找得到的索引就没有实际意义了,只能确定当前数字在数组中是否存在,因为排序之后数字的位置可能就发生变化了。
查找过程:首先,我们必须规定一个最小值,和一个最大值,而且要求出中间值,然后每次查找后,然后要查找的元素在中间值的左边,最大值要发生改变,让最大值的值变成中间值-1,缩小范围。如果要查找的元素在中间值的右边,最小值要发生改变,让最小值的值变成中间值+1,缩小范围
二分查找:可以提高查找的效率,每次可以去掉一半的范围,高效。
public static void main(String[] args) {
//前提条件:数组中的数据必须是有序的
//核心逻辑:每次排除一半的查找范围
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int num = 3;
System.out.println(efcz(arr,num));
}
public static int efcz(int arr[],int num){
//定义两个变量记录要查找的范围
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]>num){
max = mid - 1;
}else if (arr[mid]<num){
min = mid + 1;
}else{
return num;
}
}
}
}