栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中数组的两种查找 / 检索方法(遍历和二分法查找)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中数组的两种查找 / 检索方法(遍历和二分法查找)

Java中数组元素查找的两种方法:

        1.一个一个挨着找,直到找到为止。                 代码:
public class Array02 {
    public static void main(String[] args) {

        int[] arr = {11,22,33,10,32,23,43,12,43};

        // 找出arr这个数组中200所在的下标。
        // 调用方法。
        int num = 12;
        int index = arraySearch(arr,num);
        System.out.println(index == -1 ? num + "元素不存在!" : num + "元素的下标:" + index);
    }

    
    public static int arraySearch(int[] arr, int ele) {
        for (int i = 0; i < arr.length; i++) {
            if (ele == arr[i]){
                return i;
            }
        }
        return -1;
    }
}
运行结果:
D:JDKjdk1.8.0_101binjava.exe "-javaagent:D:IDEAAZIntelliJ IDEA 2020.1.1libidea_rt.jar=53903:D:IDEAAZIntelliJ IDEA 2020.1.1bin" -Dfile.encoding=UTF-8 -classpath D:JDKjdk1.8.0_101jrelibcharsets.jar;D:JDKjdk1.8.0_101jrelibdeploy.jar;D:JDKjdk1.8.0_101jrelibextaccess-bridge-64.jar;D:JDKjdk1.8.0_101jrelibextcldrdata.jar;D:JDKjdk1.8.0_101jrelibextdnsns.jar;D:JDKjdk1.8.0_101jrelibextjaccess.jar;D:JDKjdk1.8.0_101jrelibextjfxrt.jar;D:JDKjdk1.8.0_101jrelibextlocaledata.jar;D:JDKjdk1.8.0_101jrelibextnashorn.jar;D:JDKjdk1.8.0_101jrelibextsunec.jar;D:JDKjdk1.8.0_101jrelibextsunjce_provider.jar;D:JDKjdk1.8.0_101jrelibextsunmscapi.jar;D:JDKjdk1.8.0_101jrelibextsunpkcs11.jar;D:JDKjdk1.8.0_101jrelibextzipfs.jar;D:JDKjdk1.8.0_101jrelibjavaws.jar;D:JDKjdk1.8.0_101jrelibjce.jar;D:JDKjdk1.8.0_101jrelibjfr.jar;D:JDKjdk1.8.0_101jrelibjfxswt.jar;D:JDKjdk1.8.0_101jrelibjsse.jar;D:JDKjdk1.8.0_101jrelibmanagement-agent.jar;D:JDKjdk1.8.0_101jrelibplugin.jar;D:JDKjdk1.8.0_101jrelibresources.jar;D:JDKjdk1.8.0_101jrelibrt.jar;F:Java进阶IdeaDay11_5outproductionDay11_5 Array.Array02
12元素的下标:7

Process finished with exit code 0

       

2.第二种方式:二分法查找(算法),这个效率较高。

        

二分法查找(折半查找)
                第一:二分法查找建立在排序的基础之上。
                第二:二分法查找效率高于“一个挨着一个”的这种查找方式。
                第三:二分法查找原理?
                    10  23  56  89  100  111  222  235  500  600 arr数组
                    0   1   2   3   4     5   6    7    8    9

                    目标:找出 600 的下标
                    开始下标:0
                    结束下标:9
                    (0 + 9)/ 2 ---> 4 (中间元素的下标)
                    arr[4]这个元素就是中间元素:arr[4]=100
                    100 < 600
                    说明被查找的元素在 100 的右边

                    开始下标:4 + 1
                    结束下标:9
                    (5 + 9)/ 2 = 7(中间元素的下标)
                    arr[7]就是中间元素,对应 235
                    235 < 600 
                    说明被查找的元素在 235 的右边

                    开始下标:7 + 1
                    结束下标:9
                    (8 + 9)/ 2 = 8(中间元素的下标)
                    arr[8]就是中间元素,对应 500
                    500 < 600 
                    说明被查找的元素在 235 的右边

                    开始下标:8 + 1
                    结束下标:9
                    (9 + 9)/ 2 = 9(中间元素的下标)
                    arr[9]就是中间元素,对应 600
                    600 = 600 
                    此时找到了

            二分法查找的终止条件:一直折半,知道中间的那个元素恰好是被查找的元素。

代码:
public class ArrayUtil {
    public static void main(String[] args) {
        // 这个数组已经排序的。
        int[] arr = {100,200,230,235,600,1000,2000,9999};

        // 找出arr这个数组中200所在的下标。
        // 调用方法。
        int num = 200;
        int index = binarySearch(arr,num);
        System.out.println(index == -1 ? num + "元素不存在!" : num+ "元素的下标:" + index);
    }

    
    public static int binarySearch(int[] arr, int dest) {
        // 开始下标。
        int begin = 0;
        // 结束下标.
        int end = arr.length - 1;
        // 开始元素下标只要在结束元素下标的左边,就有机会继续循环。
        while(begin <= end){
            // 中间元素下标
            int mid = (begin + end) / 2;
            if (arr[mid] == dest){
                return mid;
            } else if (arr[mid] < dest){
                // 目标在“中间“的右边。
                // 开始元素下标需要发生变化(开始元素的下标需要重新赋值)。
                begin = mid + 1; // 一直增。
            } else {
                // arr[mid] > dest
                // 目标元素在”中间“左边
                // 修改结束元素下标
                end = mid - 1; // 一直减
            }
        }
        return -1;
    }
}
 运行结果:
D:JDKjdk1.8.0_101binjava.exe "-javaagent:D:IDEAAZIntelliJ IDEA 2020.1.1libidea_rt.jar=53989:D:IDEAAZIntelliJ IDEA 2020.1.1bin" -Dfile.encoding=UTF-8 -classpath D:JDKjdk1.8.0_101jrelibcharsets.jar;D:JDKjdk1.8.0_101jrelibdeploy.jar;D:JDKjdk1.8.0_101jrelibextaccess-bridge-64.jar;D:JDKjdk1.8.0_101jrelibextcldrdata.jar;D:JDKjdk1.8.0_101jrelibextdnsns.jar;D:JDKjdk1.8.0_101jrelibextjaccess.jar;D:JDKjdk1.8.0_101jrelibextjfxrt.jar;D:JDKjdk1.8.0_101jrelibextlocaledata.jar;D:JDKjdk1.8.0_101jrelibextnashorn.jar;D:JDKjdk1.8.0_101jrelibextsunec.jar;D:JDKjdk1.8.0_101jrelibextsunjce_provider.jar;D:JDKjdk1.8.0_101jrelibextsunmscapi.jar;D:JDKjdk1.8.0_101jrelibextsunpkcs11.jar;D:JDKjdk1.8.0_101jrelibextzipfs.jar;D:JDKjdk1.8.0_101jrelibjavaws.jar;D:JDKjdk1.8.0_101jrelibjce.jar;D:JDKjdk1.8.0_101jrelibjfr.jar;D:JDKjdk1.8.0_101jrelibjfxswt.jar;D:JDKjdk1.8.0_101jrelibjsse.jar;D:JDKjdk1.8.0_101jrelibmanagement-agent.jar;D:JDKjdk1.8.0_101jrelibplugin.jar;D:JDKjdk1.8.0_101jrelibresources.jar;D:JDKjdk1.8.0_101jrelibrt.jar;F:Java进阶IdeaDay11_5outproductionDay11_5 Array.ArrayUtil
200元素的下标:1

Process finished with exit code 0
3.好消息

(1)SUN公司为我们程序员写好了一个数组工具类。

(2)java.util.Arrays;

(3)java.util.Arrays; 工具类有哪些方法,我们开发的时候要参考API帮助文档。

 代码:
// 导入数组工具包
import java.util.Arrays;

public class ArrayTest01 {
    public static void main(String[] args) {
        int[] arr = {3,6,5,1,2,32};

        // 排序
        Arrays.sort(arr);
        // 遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "t");
        }
        // 分隔
        System.out.println("n=======");
        // 二分法查找(建立在排序的基础之上)如果有相同的,遇到谁就是谁,不一定是第一个
        int num = 32;
       int index = Arrays.binarySearch(arr,num);
        System.out.println(index == -1 ? num + "元素不存在!" : num+ "元素的下标:" + index);
    }
}
运行结果:
D:JDKjdk1.8.0_101binjava.exe "-javaagent:D:IDEAAZIntelliJ IDEA 2020.1.1libidea_rt.jar=54342:D:IDEAAZIntelliJ IDEA 2020.1.1bin" -Dfile.encoding=UTF-8 -classpath D:JDKjdk1.8.0_101jrelibcharsets.jar;D:JDKjdk1.8.0_101jrelibdeploy.jar;D:JDKjdk1.8.0_101jrelibextaccess-bridge-64.jar;D:JDKjdk1.8.0_101jrelibextcldrdata.jar;D:JDKjdk1.8.0_101jrelibextdnsns.jar;D:JDKjdk1.8.0_101jrelibextjaccess.jar;D:JDKjdk1.8.0_101jrelibextjfxrt.jar;D:JDKjdk1.8.0_101jrelibextlocaledata.jar;D:JDKjdk1.8.0_101jrelibextnashorn.jar;D:JDKjdk1.8.0_101jrelibextsunec.jar;D:JDKjdk1.8.0_101jrelibextsunjce_provider.jar;D:JDKjdk1.8.0_101jrelibextsunmscapi.jar;D:JDKjdk1.8.0_101jrelibextsunpkcs11.jar;D:JDKjdk1.8.0_101jrelibextzipfs.jar;D:JDKjdk1.8.0_101jrelibjavaws.jar;D:JDKjdk1.8.0_101jrelibjce.jar;D:JDKjdk1.8.0_101jrelibjfr.jar;D:JDKjdk1.8.0_101jrelibjfxswt.jar;D:JDKjdk1.8.0_101jrelibjsse.jar;D:JDKjdk1.8.0_101jrelibmanagement-agent.jar;D:JDKjdk1.8.0_101jrelibplugin.jar;D:JDKjdk1.8.0_101jrelibresources.jar;D:JDKjdk1.8.0_101jrelibrt.jar;F:Java进阶IdeaDay11_5outproductionDay11_5 Array.ArrayTest01
1	2	3	5	6	32	
=======
32元素的下标:5

Process finished with exit code 0

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/423942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号