01.Java版binarySearch 初级版

34 阅读2分钟

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>