Two search/retrieval methods for arrays in Java (traversal and binary search)

Two ways to find array elements in Java:

        1. Look for them one by one until you find them.

                code:

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);
    }

    /**
     * 从数组检索某个元素的下标,返回的是第一个该元素的下标,因为for循环是从前到后的
     * @param arr 被检索的数组
     * @param ele 被检索的元素
     * @return -1 表示该元素不存在,其他表示返回目标元素的下标。
     */
    public static int arraySearch(int[] arr, int ele) {
        for (int i = 0; i < arr.length; i++) {
            if (ele == arr[i]){
                return i;
            }
        }
        return -1;
    }
}

operation result:

D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=53903:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.Array02
12元素的下标:7

Process finished with exit code 0

       

2. The second method: binary search (algorithm), which is more efficient.

        

Binary search (half search)
                First: Binary search is based on sorting.
                Second: The efficiency of binary search is higher than that of "one by one".
                Third: Dichotomy search principle?
                    10 23 56 89 100 111 222 235 500 600 arr array
                    0 1 2 3 4 5 6 7 8 9

                    Goal: Find the subscript of 600
                    Start subscript: 0
                    End subscript: 9
                    (0 + 9) / 2 ---> 4 (subscript of the middle element)
                    arr[4] This element is the middle element: arr[4 ]=100
                    100 < 600
                    indicates that the searched element is on the right of 100

                    Start subscript: 4 + 1
                    End subscript: 9
                    (5 + 9) / 2 = 7 (the subscript of the middle element)
                    arr[7] is the middle element, corresponding to 235
                    235 < 600 
                    means that the searched element is on the right of 235

                    Start subscript: 7 + 1
                    End subscript: 9
                    (8 + 9) / 2 = 8 (the subscript of the middle element)
                    arr[8] is the middle element, corresponding to 500
                    500 < 600 
                    indicates that the searched element is on the right of 235

                    Start subscript: 8 + 1
                    End subscript: 9
                    (9 + 9) / 2 = 9 (the subscript of the middle element)
                    arr[9] is the middle element, corresponding to 600
                    600 = 600 
                    found at this time

            The termination condition of the binary search: keep halving, knowing that the element in the middle is exactly the element being searched.

code:

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);
    }

    /**
     * 从数组中查找目标元素的下标。
     * @param arr 被查找的数组(这个必须已经排序的)。
     * @param dest 目标元素
     * @return -1 表示该元素不存在,其他表示返回目标元素的下标。
     */
    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;
    }
}

 operation result:

D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=53989:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.ArrayUtil
200元素的下标:1

Process finished with exit code 0

3. Good news

(1) SUN has written an array tool class for our programmers.

(2)java.util.Arrays;

(3) java.util.Arrays; What are the methods of the tool class, we should refer to the API help document when we develop.

 code:

// 导入数组工具包
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);
    }
}

operation result:

D:\JDK\jdk1.8.0_101\bin\java.exe "-javaagent:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=54342:D:\IDEA\AZ\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JDK\jdk1.8.0_101\jre\lib\charsets.jar;D:\JDK\jdk1.8.0_101\jre\lib\deploy.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\JDK\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\JDK\jdk1.8.0_101\jre\lib\javaws.jar;D:\JDK\jdk1.8.0_101\jre\lib\jce.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfr.jar;D:\JDK\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\JDK\jdk1.8.0_101\jre\lib\jsse.jar;D:\JDK\jdk1.8.0_101\jre\lib\management-agent.jar;D:\JDK\jdk1.8.0_101\jre\lib\plugin.jar;D:\JDK\jdk1.8.0_101\jre\lib\resources.jar;D:\JDK\jdk1.8.0_101\jre\lib\rt.jar;F:\Java\进阶\Idea\Day11_5\out\production\Day11_5 Array.ArrayTest01
1	2	3	5	6	32	
=======
32元素的下标:5

Process finished with exit code 0

Guess you like

Origin blog.csdn.net/weixin_51906670/article/details/121158772