Java基础_目录
点击查看
J.1 二分查找
需求:查找数字126
正常的查找:
从索引0开始一个一个的查找,先看索引0对应的元素是不是126,发现不是,然后查看索引1对应的元素是不是126,发现也不是,然后一直往后查找,直到找到索引为31的的元素才找到,一共找了32次才找到要找的元素,效率很低
J.1.1 什么是二分查找
二分查找:
要求:有序的数组
步骤:
1.确定搜索的范围,最开始是0-31,将126与中间位置的元素进行比较,发现126比该中间元素大,也说明该元素左边的所有元素都小于126
2.接下来只要在右边范围的元素中再次按照步骤1查找
3.以此类推,第5次时查找到了最终的元素
J.1.2 手写二分查找
Floor向下取整
代码示例:
package com.peppacatt.springboottest.interview;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
/**
* 二分查找
*/
public class BinarySearch {
@Test
public void myMain() {
int[] arr = {1, 4, 7, 24, 88, 22, 72};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
System.out.println(binarySearch(arr, 24));
}
/**
* 二分查找
*
* @param arr 有序的数组
* @param num 要查找的数字
* @return 数组的索引值,-1表示未找到
*/
public int binarySearch(int[] arr, int num) {
int l = 0;
int r = arr.length - 1;
while (l <= r) {
int m = (l + r) / 2;
if (arr[m] < num) {
l = m + 1;
} else if (arr[m] > num) {
r = m - 1;
} else {
return m;
}
}
//返回-1表示未找到
return -1;
}
}
执行测试类结果:
J.1.3 解决整数溢出
问题:
在执行l+r时如果r是最大int值,可能会导致整数溢出
比如:此时要查找的元素在m右边, m+1+r就超出了int值的最大值(变成负数了)
解决方法一:
将(r+l)/2替换为: l+((r-l)/2)
解决方法二:
使用右移运算>>>,这种方法效率更高