01.二分查找
什么是binarySearch
"binarySearch" 是一个计算机科学中常用的算法,也被称为二分查找。它是一种高效的搜索算法,适用于已排序的数组或列表中查找特定元素。
这个算法的基本思想是,将要查找的区间不断缩小为原来的一半,直到找到目标元素或确定目标元素不存在为止。具体实现时,首先需要将数组或列表按照某种方式排序(通常是升序或降序),然后利用数组或列表的中间元素与目标元素进行比较。如果中间元素等于目标元素,则返回该元素的索引;如果中间元素大于目标元素,则在前半部分继续查找;如果中间元素小于目标元素,则在后半部分继续查找。重复以上过程,直到找到目标元素或确定其不存在为止。
题目
需求: 在有序数组A内,查找值target
- 如果找到值target返回索引
- 如果找不到值target返回-1
如果要解决这个问题,我们有很多种实现方式,二分查找是一种比较优秀的算法,可以解决这个问题。
由于每次查找都可以将待查找区间减半,因此二分查找的时间复杂度为 O(log n),是一种非常高效的查找算法。
思维定势: 其实就是指我们在日常生活中,根据之前的 教训和思维规律,形成的比较稳性的、定型了的思维路线或模式等。
我们先来解决一下我们传统的思维定势,我们给定一个Java数组,数组内有n个数,那么数组内第一个数字的下标是0,数组内最后一个下标为n-1。这个是我们在学习Java数组的时候老师就会反复提及的问题。如果你懂了数组下标和数组内元素位置的关系后,这道题就会很简单。
数组下标 = 数组的位置 - 1
二分查找java代码实现
package com.lzh;
/**
* @Author:kaiyang.cui
* @Package:com.lzh
* @Project:AllDS
* @name:BinarySearch
* @Date:2023/3/31 下午12:02
* @Filename:BinarySearch
* @Description:BinarySearch二分查找
* @Version:1.0
*/
public class BinarySearch {
public static int binarySearch(int[] a,int target){
int left = 0;
int right = a.length-1;
while (left<=right){
int mid = (left+right) >>> 1;
if (a[mid]==target){
return mid;
}else if (a[mid]<target){
left = mid+1;
}else {
right = mid-1;
}
}
return -1;
}
}
测试用例:
package com.lzh;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static com.lzh.BinarySearch.binarySearch;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* @Author:kaiyang.cui
* @Package:com.lzh
* @Project:AllDS
* @name:TestBinarySearch
* @Date:2023/3/31 下午12:20
* @Filename:TestBinarySearch
* @Description:二分查找断言测试
* @Version:1.0
*/
public class TestBinarySearch {
@Test
@DisplayName("BinarySearch 找到")
public void test1(){
int[] a = {7,13,21,30,38,44,52,53};
assertEquals(0,binarySearch(a,7));
assertEquals(1,binarySearch(a,13));
assertEquals(2,binarySearch(a,21));
assertEquals(3,binarySearch(a,30));
assertEquals(4,binarySearch(a,38));
assertEquals(5,binarySearch(a,44));
assertEquals(6,binarySearch(a,52));
assertEquals(7,binarySearch(a,53));
}
@Test
@DisplayName("binary search 未找到")
public void test2(){
int[] a = {7,13,21,30,38,44,52,53};
assertEquals(-1,binarySearch(a,100));
assertEquals(-1,binarySearch(a,-100));
}
}
附录
本次程序是使用的maven项目
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>