陣列的查詢(搜尋):線性查詢和二分法查詢

靜靜的程式猿進化史發表於2020-11-25
package cn.com.ArrayTest;

import java.util.MissingFormatArgumentException;

/**
 * @author LENOVO
 * @date 2020/11/25 14:30
 * @description 陣列的查詢(搜尋):線性查詢,二分查詢  
 * 二分查詢的查詢更加快一些,相比較於線性查詢,但是前提是二分法必須要是有序的陣列
 */
public class ArrayTest2 {
    public static void main(String[] args) {
        String[] arr = new String[]{"JJ", "DD", "MM", "BB", "GG", "AA"};
        //遍歷
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }

        System.out.println();  //換行
        //線性查詢:
        String dest = "BB"; // 查詢arr陣列的BB

        //這裡定義一個布林型別的 true,如果沒有定義,下面直接“很遺憾···”的時候,無論找到或者沒找到都要輸出這句話
        boolean isFlag = true;

        //遍歷過程找一下有沒有BB
        for (int i = 0; i < arr.length; i++) {
            //這裡是String型別,所以使用equals來比較內容是否相同
            if (dest.equals(arr[i])) {
                System.out.println("找到了指定元素,位置為:" + i);
                isFlag = false;   //如果進來了就把之前定義好的true改為false
                break;
            }
        }
        if (isFlag) {//如果沒有進去過,就還是ture
            System.out.println("很遺憾沒有找到哦!");
        }

        //二分查詢:前提條件是必須是有序的陣列,升序或者降序都沒關係

        int[] arr2 = new int[]{-98, -34, -3, 0, 34, 45, 98, 234, 333};  //升序

        int dest1 = 45;//要查詢的數指為  45 所以宣告一個變數
        int head = 0; //初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean isFlag1 = true;
        while (head <= end) {
            int middle = (head + end) / 2;// middle是中間索引值的意思

            if (dest1 == arr2[middle]) {//要查詢的值 剛好等於中間值
                System.out.println("找到了指定元素,位置為:" + middle);
                isFlag1 = false;
                break;
            } else if (dest1 < arr2[middle]) { //升序情況下:中間值比要查詢的數大  ,那麼就是從新開始了頭是dest1,尾是中間值
                end = middle - 1;
            } else { //dest1 > arr2[middle]
                head = middle + 1;
            }
        }
        if (isFlag1) {
            System.out.println("很遺憾沒有找到哦!");
        }
    }
}

相關文章