查找算法-二分查找

二分查找

概念

二分查找(Binary Search)也称为折半查找,一种效率较高的查找的,但是二分查找法的前提是线性结构必须是有序排序。

查找过程

假设线性结构为升序排序,将线性结构对半,中间的数据与要查找的数据比较,

  • 中间数据相等查找数据:则查找成功。
    • 不相等就利用中间数据分为前子表,和后子表,
  • 中间数据大于查找数据:则查找前子表数据
  • 中间数据小于查找数据:则查找后子表数据

如此反复查找,知道查找成功,

查找算法-二分查找_第1张图片

实例

package com.sin.arrays;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author sin
 * @date 2022/11/21
 * @apiNote
 */
public class BinarySearchDemo {
    int[] demoArray = {2, 5, 8, 9, 3, 23, 12, 90, 34};

    @Test
    public void binarySearch() {
        Arrays.sort(demoArray);
        System.out.println("排序后的数组" + Arrays.toString(demoArray));

        //定义查找区间
        //开始索引
        int beginIndex = 0;
        //结束索引
        int endIndex = demoArray.length - 1;

        //查找数据
        int searchData = 12;

        //记录查找次数
        int searchCount = 0;

        while (beginIndex <= endIndex) {
            //记录查找次数
            searchCount++;
            //数据对半找中间数索引
            int mid = beginIndex + ((endIndex - beginIndex) >> 1);//相当于mid= (beginIndex + endIndex)/2

            //查找数据
            if (demoArray[mid] == searchData) {//中间数据与查找数据对比
                System.out.println("数据已找到" + demoArray[mid]);
                break;
            } else if (demoArray[mid] < searchData) {
                //中间数小于查找数据,查找后子表
                beginIndex = mid + 1;
            } else if (demoArray[mid] > searchData) {
                //中间数大于查找数据,查找前子表
                endIndex = mid - 1;
            }


        }
        System.out.println("查找数据" + searchData + "查找" + searchCount + "次");
    }
}

查找算法-二分查找_第2张图片

工具类

package com.sin.demo.utli;

import java.util.Arrays;

/**
 * @author sin
 * @date 2022/11/21
 * @apiNote
 */
public class BinarySearchUtil {

    //操作的数组
    private int[] copyArray;
    private int beginIndex, endIndex;

    private int[] setCopyArray(int[] copyArray){
        return this.copyArray=copyArray;
    }

    public  int searchData(int[] array, int searchValue) {
        //数组复制,操作本来数组
        this.setCopyArray(array);
        //将数组从小到打排序
        Arrays.sort(this.copyArray);
        //开始索引
        this.beginIndex = 0;
        //结束索引
        this.endIndex = this.copyArray.length;

        return searchData(beginIndex,endIndex,searchValue);


    }
    
    private int searchData(int beginIndex,int endIndex,int searchValue){
        while (beginIndex <= endIndex) {
            int mid = beginIndex + ((endIndex - beginIndex) >> 1);
            if (this.copyArray[mid] == searchValue){
                return copyArray[mid];
            }else if(this.copyArray[mid] < searchValue){
                beginIndex = mid + 1;
            }else if(this.copyArray[mid] > searchValue){
                endIndex = mid - 1;
            }
        }

        return 0;
    }
    


}

测试

 @Test
    public void searchArrayData(){
        System.out.println(new BinarySearchUtil().searchData(demoArray, 8));
    }

查找算法-二分查找_第3张图片

你可能感兴趣的:(查找算法,算法,java,数据结构)