• java基础面试题9--数组高级-二分查找


    首先明确一点:
    二分查找是有条件限制的,被查找的数组要求一定是有序

    原理图:

    这里写图片描述

    这里有两个函数,分别使用非递归递归思想实现了二分查找的功能

    package search;
    
    import java.util.Scanner;
    
    public class BinarySearch {
    
        /**
         * 函数功能:非递归二分查找
         * 输入参数:arg1:被查找的数组
         *          arg2:目标数字
         * return:目标数字的index,若找不到返回-1
         */
        public static int binarySearchWithoutR(int[] arr,int target){
            //定义查找段的开始head
            int head = 0;
            //定义查找段的结尾tail
            int tail = arr.length-1;
            System.out.println("查找的索引从"+head+"->"+tail);
            int middle = 0;
            while(head<=tail){
                //定义需要被比较的中间数
                middle = (head + tail)/2; 
                if(arr[middle]==target){
                    return middle;
                }else if(target<arr[middle]){
                    tail = middle-1;
                }else if(target>arr[middle]){
                    head = middle+1;
                }
            }
    
            return -1;
        }
        /**
         * 函数功能:递归二分查找
         * 输入参数:arg1:被查找的数组
         *          arg2:head--定位查找段的开始index
         *          arg3:tail--定位查找端的结束index
         *          arg4:target--目标数字
         * return:目标数字的index,若找不到返回-1
         */
        public static int binarySearchWithR(int[] arr, int head, int tail, int target){
            //定义需要被比较的中间数
            int middle = (head+tail)/2;
            while(head<tail){
                if(arr[middle]==target){
                    return middle;
                }else if(target<arr[middle]){
                    return binarySearchWithR(arr,head,tail = middle-1,target);
                }else if(target>arr[middle]){
                    return binarySearchWithR(arr,head=middle+1,tail,target);
                }
            }
    
            return -1;
        }
        /**
         * 格式打印数组
         * @param arr
         */
        public static void printArray(int [] arr){
            System.out.print("[");
            for(int x=0;x<arr.length;x++){
                if(x==arr.length-1){
                    System.out.print(arr[x]+"]");
                    System.out.println();
                }else{
                    System.out.print(arr[x]+", ");
                }
            }
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            //定义查找对象数组
            int [] a ={1, 4, 5, 8, 15, 33, 36, 41, 48, 77, 81, 90, 94, 96};
            printArray(a);
            System.out.println("请输入要查找的数,回车后开始查找");
            Scanner scan = new Scanner(System.in);
            int target = new Integer(scan.next());
                System.out.println("正在启动查找程序.....");
            //调用非递归查找函数
            System.out.println("调用非递归查找函数----------------");
            int res = binarySearchWithoutR(a, target);
            //判断结果
            if(res==-1){
                System.out.println("没有找到!!数组中不存在这个数");
            }else{
                System.out.println("找到了!index是:"+res);
            }
    
            //调用递归查找函数
            System.out.println("调用递归查找函数-----------------");
            int res1 = binarySearchWithR(a,0,a.length-1,target);
            //判断结果
            if(res1==-1){
                System.out.println("没有找到!!数组中不存在这个数");
            }else{
                System.out.println("找到了!index是:"+res1);
            }
        }
    
    }
    

    查找结果演示:

    [1, 4, 5, 8, 15, 33, 36, 41, 48, 77, 81, 90, 94, 96]
    请输入要查找的数,回车后开始查找
    36
    正在启动查找程序.....
    调用非递归查找函数----------------
    查找的索引从0->13
    找到了!index是:6
    调用递归查找函数-----------------
    找到了!index是:6
  • 相关阅读:
    Vue 移动端向上滑动加载
    关于NPOI 判断Office 是否为空的操作
    定时任务的处理
    Web中线程与IIS线程池自动回收机制
    本地VS调试服务器 IIS 程序
    每天学点node系列-stream
    聊聊前端模块化开发
    位运算解决多标签问题【原创】
    <未来世界的幸存者> 读后感(现实篇和职业篇)【原创】
    Nest.js你学不会系列-初识Nest
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932815.html
Copyright © 2020-2023  润新知