• 3 二分查找


     1.算法简介

      1.二分查找又称折半查找,它是一种效率较高的查找方法。

      2.二分查找要求:(1)必须采用顺序存储结构 (2)必须按关键字大小有序排列(可以从小到大也可以由大到小)

    2.原理

      将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。

    3.动图演示

       

    4.代码

      

    public class BinarySearch {
    
        //循环实现二分查找算法
        public static int binSerch(int srcArray[], int key) {
    
            //求出中间值
            int mid = srcArray.length / 2;
            int start = 0;
            int end = srcArray.length - 1;
            //如果查找值等于中间值,则直接返回中间值的key
            if (key == srcArray[mid]) {
                return mid;
            }
            //如果key比中间值小则终值为中间值-1进行下一次循环,如果key比中间值大则开始值为中间值+1进行下一次循环
            while (start < end) {
                mid = (end - start) / 2 + start;
                if (key < srcArray[mid]) {
                    end = mid - 1;
                } else if (key > srcArray[mid]) {
                    start = mid + 1;
                } else {
                    return mid;
                }
            }
            return -1;
        }
    
        /*递归实现查找算法,如果key等于中间位置的值则直接返回中间值的位置,如果key小于中间值,则调用下一次循环end值为中间值的前一位
          如果key大于中间值则调用下一次循环start值为中间值的后一位*/
        public static int binSerch(int srcArray[], int key, int start, int end) {
            int mid = (start + end) / 2;
            if (key == srcArray[mid]) {
                return mid;
            } else if (start > end) {
                return -1;
            }
            if (key < srcArray[mid]) {
                return binSerch(srcArray, key, start, mid - 1);
            } else if (key > srcArray[mid]) {
                return binSerch(srcArray, key, mid + 1, end);
            }
            return -1;
        }
    
        public static void main(String[] args) {
            int arr[] = {1, 2, 3, 4, 5, 66, 77, 88, 99};
            int seachValue = 88;
    
            System.out.printf("开始进行循环二分查找%s的位置为%s", seachValue, binSerch(arr, seachValue));
            System.out.println();
            System.out.printf("开始进行递归二分查找%s的位置为%s", seachValue, binSerch(arr, seachValue, 0, arr.length - 1));
        }
    
    }
  • 相关阅读:
    OpenCV--图像特征(harris角点检测)
    pycharm处理命令行参数
    OpenCV--文档扫描OCR识别
    OpenCV--信用卡数字识别
    OpenCV--傅里叶变换
    OpenCV--直方图
    OpenCV--模板匹配
    OpenCV--图像轮廓
    OpenCV--图像金字塔
    51Nod-1288 汽油补给 ST表 贪心 模拟
  • 原文地址:https://www.cnblogs.com/zhiaijingming/p/10383489.html
Copyright © 2020-2023  润新知