前言
以下所有的查找算法全部針對如下問題:
設計一個方法,用於在指定的數組中查找指定的值。若找到,返回下標;否則返回 -1.
算法將會不斷補充,歡迎喜歡的小夥伴們持續關注。
如果對你有幫助,歡迎點贊哦!(づ ̄3 ̄)づ╭❤~
方法一:順序查找
1. 順序查找是啥?
順序查找,顧名思義,就是按照從頭到尾的順序遍歷一遍數組。
2. 代碼實現
public static int sequentialSearch(int arr[], int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == num){
return i;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(sequentialSearch(new int[]{1,2,3,4}, 3));
}
控制檯輸出結果如下(數組的腳標是從0開始的哦):
方法二:二分查找
1. 二分查找是啥?
有這樣的一個數組,數組元素是有序排列的。其內部存儲如下元素:4、5、7、8、9。同時藍色指明的是範圍的起始(leftIndex)、橙色是範圍的結束(rightIndex)。
現在,我們想要查詢 8 是否在數組中。(目的)
首先,我們取出該範圍中處在中間位置的元素 7 與 所要查找的 8 進行比較。
我們發現8大於7,此時捨去中間元素的左邊部分,只保留右邊部分。
繼續之前的操作,選出這一部分的中間元素,與8進行比較。
我們發現該元素就是我們所要的元素,返回數組內該元素的下標,二分查找完成。
在整個流程中,我們可以發現每次取出比較都可以捨去現有的一半元素,相較於順序查找,其效率大大提升。
2. 關鍵點提煉
仔細觀察整個流程我們可以發現有以下幾個關鍵點。
- 確定中間標尺(midIndex)並取出中間元素的值(midValue)。midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);midValue = arr[midIndex]
- 左右標尺的移動。如果我們想要查找的值(targetValue)大於中間元素的值(midValue),即 targetValue > midValue,那麼左標尺(leftIndex)移動到中間標尺(midIndex)右邊一位,即 leftIndex = midIndex + 1。如果我們想要查找的值(targetValue)小於中間元素的值(midValue),即 targetValue < midValue,那麼右標尺(rightIndex)移動到中間標尺左邊一位,即rightIndex = midValue - 1。
- 何時停止移動左右標尺。當左右標尺相遇或相錯或者我們尋找到了想要查找的目標值,那麼我們就可以停止移動標尺了。
3. 代碼實現
public static int binarySearch(int[] arr, int targetValue){
// 左右標尺初始化
int leftIndex = 0;
int rightIndex = arr.length - 1;
// 3. 左右標尺移動終止條件之一,左右標尺相遇或相錯
while(leftIndex <= rightIndex){
// 1. 確定中間標尺
int midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);
// 1. 取出中間標尺位置的元素
int midValue = arr[midIndex];
// 2. 左右標尺移動
if(targetValue > midValue){ // 查找的值大於中間元素
leftIndex = midIndex + 1; // 移動左標尺
}else if(targetValue < midValue){ // 查找的值小於中間元素
rightIndex = midIndex - 1; // 移動右標尺
}else{ // 3. 查找的值等於中間元素 左右標尺移動終止條件之二
return midIndex;
}
}
return -1; // 3. 沒有查找到targetValue
}