天天看點

Java語言實作線性查找和二分法查找Java語言實作線性查找和二分法查找 (查找算法)

Java語言實作線性查找和二分法查找 (查找算法)

線性查找(順序查找)

定義:

在一列給定的值中進行搜尋,從一端開始逐一檢查每個元素,直到找到所需元素的過程。

本質:

如果查找池是某種類型的一個表,比如一個數組,簡單的查找方法是從表頭開始,一次将每一個值與目标元素進行比較。最後,或者查找到目标,或者達到表尾,而目标不存在于組中,這個方法稱為線性查找。

代碼示例:

public class SearchAlgorithm {
    public static void main(String[] args) {
        //查找(或搜尋)
        //線性查找
        String[] arr = new String[]{"AA","BB","CC","DD","EE","FF"};
        String dest = "EE";   //目标元素
        boolean isFlag = true;   //定義一個标記變量,用來記錄程式是否找到了指定元素

        for (int i = 0;i < arr.length;i++){
            if(dest.equals(arr[i])){            //調用String類中的equals方法來判斷兩個字元串相等
                System.out.println("找到了指定的元素,位置為:" + i);
                isFlag = false;   //若程式找到了指定元素,則将isFlag置為false,否則isFlag仍為true
                break;    //倘若找到指定元素,直接跳出查找元素的循環
            }
        }
        
        //若程式未曾找到指定元素,即無法進入上述循環中的if語句塊,isFlag仍然是true,得以執行下面這段if語句塊
        if(isFlag){
            System.out.println("很遺憾,沒有找到指定元素哦!");
        }

    }
}
           
Java語言實作線性查找和二分法查找Java語言實作線性查找和二分法查找 (查找算法)

二分法查找

定義:

二分查找又稱折半查找,它是一種效率較高的查找方法。

二分查找的前提要求:

1.必須采用順序存儲結構 。

2.必須按關鍵字大小有序排列。

優缺點:

二分法查找的優點是元素比較次數少、查找速度快、平均性能好;

其缺點是要求待查表為有序表,且插入删除困難。是以,這種查找方法适用于不經常變動而查找頻繁的有序清單。

算法思想:

首先,将表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄将表分成前、後兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。

重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

時間複雜度:

假設待查數組長度(問題規模)為n,則其算法複雜度為o(log(n))

代碼示例:

public class ArrayTest3 {
    public static void main(String[] args) {
        //二分法查找
        //前提:所要查找的數組必須有序
        int[] arr = new int[]{-98,-34,2,34,54,66,79,105,210,333};
        int dest = 34;   //目标元素
        int head = 0;   //初始的首索引
        int end = arr.length - 1;  //初始的末索引
        boolean isFlag = true;
        while(head <= end){
            int middle = (head + end)/2;  //折中得到中間元素

            if (dest == arr[middle]){    //若中間元素剛好與目标元素相等,則直接查找成功
                System.out.println("找到了指定的元素,位置為:" + middle);
                isFlag = false;
                break;
            }else if (arr[middle] > dest){   //若中間元素比目标元素大,則查找前半子表
                end = middle -1;  //将前半子表的最後一個元素賦給end,得到一個新的末索引
            }else {     //arr[middle] < dest ,中間元素比目标元素小,則查找後半子表
                head = middle + 1;  //将後半子表的第一個元素賦給head,得到一個新的首索引
            }
            /*
            經曆一次循環後無法找到指定元素就會進入新一次循環,新一次循環的待查表為上一次循環的前半子表或後半子表
             */
        }
        
        //若程式未曾找到指定元素,即無法進入上述循環中的if語句塊,isFlag仍然是true,得以執行下面這段if語句塊
        if (isFlag){
            System.out.println("很遺憾,沒有找到指定元素哦!");
        }

    }
}
           
Java語言實作線性查找和二分法查找Java語言實作線性查找和二分法查找 (查找算法)