目录
前言
详细图解
代码部分
前言
查找算法中,首要讨论的是基本查找,也就是顺序查找,在数据量特别大的时候,基本查找这种从前往后挨个找的形式,性能是很差的!
所以为了提高一些性能,产生了各种查找算法。这里要学习介绍的是二分查找,也叫折半查找。
二分查找有一个前提条件和一个核心思想:
- 前提条件:数组中的数据必须是有序的
- 核心思想:每次排除一半的数据,查询数据的性能明显提高许多!
假设有一个有序数组, { 7,2,79,81,103,127,131,147}
我们用图解来推演一下是如何进行查找的:
详细图解
以查找131为例:
(此处的right 坐左朝右;left 坐右朝左。不要模仿doge)
注意:二分查找正常的折半条件应该是开始位置let<=结束位置right!
代码部分
package user.Arithmetic;
public class BinarySearch {
public static void main(String[] args) {
//1.准好好一个数组
int[] arr = { 7,2,79,81,103,127,131,147};
System.out.println(myBinarySearch(arr,131));
}
public static int myBinarySearch(int[] arr,int data){
//1.定义两个变量,一个在初始位置,另一个在末尾位置
int left = 0;
int right = arr.length - 1;
//2.定义一个循环控制折半
while(left <= right){
//3.每次折半,都要算出中间位置处的索引
int middle = (left + right) / 2;
//4.判断当前要找的元素值,与中间位置处的元素值的大小
if(data < arr[middle]){
//往左边找,右边的索引改为: 中间索引 - 1
right = middle - 1;
}else if(data > arr[middle]){
//往右边找,左边的索引改为: 中间索引 + 1
left = middle + 1;
}else{
//中间位置处的元素值,正好等于我们要找的元素值
return middle;
}
}
return -1;
}
}
运行结果:
END
学习自:黑马程序员——JavaSE课程