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("很遺憾,沒有找到指定元素哦!");
}
}
}

二分法查找
定義:
二分查找又稱折半查找,它是一種效率較高的查找方法。
二分查找的前提要求:
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("很遺憾,沒有找到指定元素哦!");
}
}
}