zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    .Net高并发解决思路 以及乐观锁 悲观锁等
    HTTP和HTTPS TCP/IP的UDP和TCP Socket和WebSocket RabbitMq和队列 Redis和Memcached
    C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==
    C# 托管与非托管类型 堆和栈 值类型与引用类型 装箱与拆箱
    C# 递归、冒泡算法 委托与事件 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引底层 表达式树
    C# 爬取数据
    C# 常用设计模式 并发编程(异步 多线程) 锁与死锁 集合数组List
    C# NPOI Excel多级表头导出多个表
    windows Server 2016安装Sqlserver远程连接的坑
    hdfs之NameNode故障处理的两种方式
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932815.html
Copyright © 2011-2022 走看看