zoukankan      html  css  js  c++  java
  • java两种方式实现二分查找

    java两种方式实现二分查找

    1.while循环实现

    2.递归实现

    二分查找是什么?

    ​ 二分查找,又名折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。

    代码演示

    package com.ks.binarysearch;
    /**
     * @author 柯神_
     * @date 2020-12-23 17:00:02
     * @Description 二分查找,又名折半查找
     */
    public class BinarySearch {
        private final static int error = -1;
    
        public static void main(String[] args) {
            /**
             * 1.测试while循环
             */
            int[] a = {1, 2, 4, 9};
            System.out.println("===while循环实现=============");
            System.out.println("key:1,在数组中的位置" + bSearch(a, 1));
            System.out.println("key:2,在数组中的位置" + bSearch(a, 2));
            System.out.println("key:4,在数组中的位置" + bSearch(a, 4));
            System.out.println("key:9,在数组中的位置" + bSearch(a, 9));
    
            /**
             * 2.测试递归
             */
            System.out.println("===递归实现=============");
            System.out.println("key:1,在数组中的位置" + recursionSearch(a, 1, 0, a.length - 1));
            System.out.println("key:2,在数组中的位置" + recursionSearch(a, 2, 0, a.length - 1));
            System.out.println("key:4,在数组中的位置" + recursionSearch(a, 4, 0, a.length - 1));
            System.out.println("key:9,在数组中的位置" + recursionSearch(a, 9, 0, a.length - 1));
        }
    
    
        /**
         * 1.非递归方式
         */
        public static int bSearch(int[] arr, int key) {
            int low = 0;
            int hgt = arr.length - 1;
            int mid = 0;
    
            //优化查询条件
            if (key < arr[0] || key > arr[hgt]) {
                return error;
            }
    
            while (low <= hgt) {
                mid = (low + hgt) / 2;
                if (key < arr[mid]) {
                    hgt = mid - 1;  //向左查找
                }
                if (key > arr[mid]) {
                    low = mid + 1;  //向右查找
                }
                if (key == arr[mid]) {
                    return mid;     //找到返回
                }
            }
            return error;           //找不到返回
        }
    
    
        /**
         * 2.递归
         */
        public static int recursionSearch(int[] arr, int key, int low, int hgt) {
    
            int mid = (low + hgt) / 2;
    
            //优化查询条件
            if (key < arr[low] || key > arr[hgt] || low > hgt) {
                return error;
            }
    
            if (key < arr[mid]) {
                return recursionSearch(arr, key, low, mid - 1);    //向左查找
            }
            if (key > arr[mid]) {
                return recursionSearch(arr, key, mid + 1, hgt);    //向右查找
            }
            if (key == arr[mid]) {
                return mid;                    //找到返回
            }
            return error;                      //找不到返回
        }
    }
    
    

    结果演示

  • 相关阅读:
    [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】
    uboot中添加自己的命令【转】
    android压力测试命令monkey详解【转】
    T-sql语句修改数据库逻辑名、数据库名、物理名(sql2000)
    sql查询与修改数据库逻辑文件名,移动数据库存储路径
    如何修改SQL Server 2000的数据库逻辑与物理名称
    你是否也忘了刷新视图?
    单点登录CAS-Demo
    SQL Case when 的使用方法 (转)
    因为数据库正在使用,所以无法获得对数据库的独占访问权(转)
  • 原文地址:https://www.cnblogs.com/qqkkOvO/p/14180862.html
Copyright © 2011-2022 走看看