最近学习了java的集合相关部分知识,较之前比较深入地学习了这部分内容,特别是Map部分的HashMap,在JDK1.8之后,HashMap加入了红黑树。为什么加入了红黑树呢?这是因为红黑树的增删改查的速度都是非常快的,尤其是查询的速度,为什么查询的速度很快,主要是得益于底层的二分搜索算法。
本文主要来介绍一下二分搜索算法的思想,然后通过一个例子来进行演示、说明,希望大家和自己可以更好的理解、记住这个常用、重要的搜索算法。话不多说,下面开始进入正题。
我们先看看百度的解释:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
直接代码理解:
package com.xjyk.project.tool.swagger;
/**
* 二分搜索算法
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 二分搜索元素特定元素'8'
int result = binarySearch(arr, 8);
System.out.println(result);
}
// 二分搜索元素
private static int binarySearch(int[] newArr, int target) {
int startIndex = 0; // 搜索范围开始位置
int endIndex = newArr.length - 1; // 搜索范围结束位置
while (startIndex <= endIndex){ // 判断条件,开始位置大于结束位置查找结束
int center = newArr[endIndex / 2]; // 获取中间位置索引
if (newArr[center] == target){ // 相等直接返回索引
return center;
}else if (newArr[center] > target){ // 大于,往左边查找
endIndex = center -1;
}else { // 小于,往右边查找
startIndex = center + 1;
}
}
return -1; // 没找到目标元素,直接返回
}
}