2.1 查找元素
需求:给定一个数组,判断是否包含某个面,如果包含返回对应的下标,如果不包含返回-1
顺序查找: 优点:编码简单,容易理解,没啥逻辑,就挨个比较 数据靠前的话,效率也比较高
缺点:随机查询效率较低
二分法查找:1.建立在排序的基础上
2 .用于查找固定有序的数据
实现原理: 每次和中间比较
1 确定起始下标和结束下标
2 确定中间下标,然后和目标数据开始比较
3 如果相等.就返回中间下标即可
4 如果目标数据大于中间数据 , 结束值不变,起始值=中间值+1, 重新生成中间值,继续比较
5 如果目标数据小于中间数据,起始值不变,结束值=中间值-1.重新生成中间值,继续比较
6 当起始值大于结束值的时候,说明不存在
public class BinarySearch {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 6, 8, 13, 22, 14, 16, 26, 84, 35, 27, 9, 345,
133 };
// 排序
Arrays.sort(arr);
arr = new int[9999999];
for (int i = 0; i < arr.length; i++) {
arr[i] = i+1;
}
int target = 1;
int result = search(arr, target);
System.out.println(result);
result = binarySearch(arr, target);
System.out.println(result);
}
public static int binarySearch(int[] arr, int target) {
int count = 0;
// * 1 确定起始下标和结束下标
int startPos = 0;
int endPos = arr.length - 1;
// * 2 确定中间下标,然后和目标数据开始比较
int m = (startPos + endPos) / 2;
// 循环比较
while (startPos <= endPos) {
count++;
// * 3 如果相等.就返回中间下标即可
if (target == arr[m]) {
System.out.println("二分查找 : "+count);
return m;
}
// * 4 如果目标数据大于中间数据 , 结束值不变,起始值=中间值+1, 重新生成中间值,继续比较
if (target > arr[m]) {
startPos = m+1;
}
// * 5 如果目标数据小于中间数据,起始值不变,结束值=中间值-1.重新生成中间值,继续比较
if (target < arr[m]) {
endPos = m-1;
}
m = (startPos + endPos) / 2;
}
// * 6 当起始值大于结束值的时候,说明不存在
System.out.println("二分查找 : "+count);
return -1;
}
// 传统查找方式
public static int search(int[] arr , int num){
int count = 0;
for (int i = 0; i < arr.length; i++) {
count++;
if (arr[i] == num) {
System.out.println("顺序查找 : "+count);
return i;
}
}
System.out.println("顺序查找 : "+count);
return -1;
}
}