文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java怎么实现二分法查找

2023-07-02 18:04

关注

这篇文章主要讲解了“Java怎么实现二分法查找”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现二分法查找”吧!

二分法查找

概述

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。

但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

归并排序即运用了二分法的思想。首先需要一个由小到大排序好的数组,先对比中间的值,如果比要找的大,则向前找,取中间值前面的一半再找中间值再对比。

如果比要找的小,则向后找,取中间值后面的一半再取中间值再对比。

Java怎么实现二分法查找

递归实现

这里,我使用了递归的方法进行实现。

首先需要确认查找的范围,即有一个左索引和右索引,每次取(left+right)/2为中间值,比较要查找的元素和中间值的大小,若中间值大,则向前找,即递归范围为left ,mid-1。反之向右找,即递归范围mid+1,right。若相等即为找到。

但是需要继续向此索引的前后找找看有没有和其相等的值,一并加入到集合中,最后返回这个集合。

递归实现代码

package search;import java.util.ArrayList;import java.util.List;public class BinarySearch {    public static void main(String[] args) {        int[] array = {1,1,1,2,3,4,5,6,7};        List<Integer> integers = binarySearch(array, 0, array.length - 1, 1);//        for (Integer integer : integers) {//            System.out.print(integer+ " ");//        }        System.out.println(integers);    }    public static List<Integer> binarySearch(int[] array, int left, int right, int value){        //如果左索引大于右索引,则说明全部遍历完了,也没有找到相应的值,返回空集合即可        if (left>right){            return new ArrayList<Integer>();        }        //获取中间值的下标(二分)        int mid = (left+right)/2;        //如果要找的值比中间值小,则继续向左找        if (value < array[mid]){            return binarySearch(array, left, mid-1, value);        //要找的值比中间值小大,则向右找        }else if (value > array[mid]){            return binarySearch(array, mid+1, right, value);        //否则,说明相等,找到了        }else {            //找到一个,还需要向左右找找看有没有相同的值            List<Integer> resultList = new ArrayList();            //向左循环找,如果有,则加入到集合中            int temp = mid - 1;            while (temp>=0 && array[temp] == value){                resultList.add(temp);                temp -= 1;            }            //向右循环找,如果有,则加入到集合中            temp = mid + 1;            while (temp < array.length && array[temp] == value){                resultList.add(temp);                temp += 1;            }            //将一开始找到的那个索引页加入到集合中。            resultList.add(mid);            return resultList;        }    }        //以下这段代码来自百度百科,供大家参考。    public static int binarySearch(Integer[] srcArray, int des) {        //定义初始最小、最大索引        int start = 0;        int end = srcArray.length - 1;        //确保不会出现重复查找,越界        while (start <= end) {            //计算出中间索引值            int middle = (end + start)>>>1 ;//防止溢出            if (des == srcArray[middle]) {                return middle;                //判断下限            } else if (des < srcArray[middle]) {                end = middle - 1;                //判断上限            } else {                start = middle + 1;            }        }        //若没有,则返回-1        return -1;    }}

循环实现代码(非递归)

package search;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class BinarySearch3 {    public static void main(String[] args) {        int[] array = {1,1,1,1,1,2,3,4,5,6,7};        System.out.println(BinarySearch3.binarySearch(array, 7));    }    public static List<Integer> binarySearch(int[] array, int key){        List<Integer> resultList = new ArrayList<>();        int start = 0;        int end = array.length - 1;        while (start <= end){            int mid = (start + end) / 2;            int midValue = array[mid];            if (key > midValue){                //key比中间值大。向右找                start = mid + 1;            } else if (key < midValue){                //key比中间值小。向左找                end = mid - 1;            } else {                //否则就找到了                //先向左找有没有相同值                int temp = mid -1;                while (temp >= start && array[temp] == key){                    resultList.add(temp);                    temp -= 1;                }                //将一开始找到的加入结果集                resultList.add(mid);                //再向右找找有没有相同值                temp = mid + 1;                while (temp <= end && array[temp] == key){                    resultList.add(temp);                    temp += 1;                }                break;            }        }        return resultList;    }}

二分法查找(递归、循环)

public class BinarySearch {        //循环        private static int binarySearchByCycle(int[] arr,int num) {        int start = 0;        int end = arr.length - 1;        while (start <= end){            int mid = (start + end) / 2;            if(num == arr[mid]){                return mid;            }else if(num > arr[mid]){                start = mid + 1;            }else {                end = mid - 1;            }        }        return -1;    }    //递归        private static int binarySearchByRecursion(int[] arr,int num,int start,int end) {        int mid = (start + end) / 2;        if(num == arr[mid]){            return mid;        }else if(num > arr[mid]){            start = mid + 1;        }else {            end = mid - 1;        }        if(start <= end){            mid = binarySearchByRecursion(arr,num,start,end);  //递归继续寻找        }else {            mid = -1;        }        return mid;    }}

感谢各位的阅读,以上就是“Java怎么实现二分法查找”的内容了,经过本文的学习后,相信大家对Java怎么实现二分法查找这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯