一、二分查找
1.1 暴力查找
如果数据保存在数组这样容器中,我们会称这些数据项有线性或者顺序关系,这些数据项的存储位置称为下标,这些下标都是有序的整数.通过下标我们可以按照顺序来访问和查找数据项,这种查找方式称之为顺序查找.因为在查找的过程中,需要匹配每个数据项并判断是否符合需求(满足条件),这种查找技术也可以称之为暴力查找.是效率非常低的一种方式.
我们先用暴力查找来查找一下元素:
-
import java.util.Arrays; import java.util.Scanner; public class ViolenceSearch { public static void main(String[] args) { int[] arr = {3, 4, 56, 34, 5, 8, 6}; System.out.println(Arrays.toString(arr)); Scanner sc = new Scanner(System.in); System.out.println("请输入你要查找的元素"); int findNum = sc.nextInt(); boolean flag = false; int i = 0; for (; i < arr.length; i++) { if (findNum == arr[i]) { flag = true; break; } } if (flag) { System.out.println("找到了元素,下标为" + i); } else { System.out.println("没有找到"); } } }
查找的效率取决于匹配的次数.最好的情况是所查找的元素就位于第一个,最坏的情况是所查找的元素位于最后一个.是否有办法来优化我们的查找效率呢?
这个时候就引出二分查找
1.2 二分查找
我们只寻找一半,根据这个现象,我们把这个查找算法叫做二分查找,也叫做折半查找.
1.2.1
现在我们来用二分查找来实现刚才的查找
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {3, 4, 56, 34, 5, 8, 6};
//首先我们要将想查找的数组进行排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要查找的数");
int findNum = sc.nextInt();
//排序过后我们开始进行二分查找
//定义 一个开始 和 结束的变量
int start = 0;
int end = arr.length - 1;
int middle = 0;//将中间值初始化
boolean flag = false;
while (start <= end) {
middle = (start + end) / 2;
if (arr[middle] == findNum) {
flag = true;
break;
} else if (arr[middle] > findNum) {
end = middle - 1;
} else if (arr[middle] < findNum) {
start = middle + 1;
}
}
if (flag) {
System.out.println("middle=" + middle);
} else {
System.out.println("没有找到这个数");
}
}
}
运行结果: