東哥說算法——聊聊查找算法一家子

前言

以下所有的查找算法全部針對如下問題:
設計一個方法,用於在指定的數組中查找指定的值。若找到,返回下標;否則返回 -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. 關鍵點提煉

仔細觀察整個流程我們可以發現有以下幾個關鍵點。

  1. 確定中間標尺(midIndex)並取出中間元素的值(midValue)midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);midValue = arr[midIndex]
  2. 左右標尺的移動。如果我們想要查找的值(targetValue)大於中間元素的值(midValue),即 targetValue > midValue,那麼左標尺(leftIndex)移動到中間標尺(midIndex)右邊一位,即 leftIndex = midIndex + 1。如果我們想要查找的值(targetValue)小於中間元素的值(midValue),即 targetValue < midValue,那麼右標尺(rightIndex)移動到中間標尺左邊一位,即rightIndex = midValue - 1
  3. 何時停止移動左右標尺。當左右標尺相遇或相錯或者我們尋找到了想要查找的目標值,那麼我們就可以停止移動標尺了。

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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章