面試官還問了我另一個問題,就是給我一個嚴格遞增或是嚴格遞減的數組,讓我將裏面的某個數據取出來,這不就是折半查找嗎?
java
下面我就整理一下二分查找:
面試
算法複雜度:折半搜索每次把搜索區域減小一半,時間複雜度爲。(n表明集合中元素的個數)算法
問題描述:有一個按非降序排列的有序數組a[0...n-1]和一個數v數組
1.求數組a中最後一次出現的數key的下標ide
設l爲左邊界,h爲右邊界,mid = (l+h)/2,那麼,根據mid的取值,分三種狀況:spa
(1) a[mid] < key,說明v若是在數組中,應該出如今mid右側,則調整左邊界,l = mid + 1orm
(2) a[mid] > key,說明v若是在數組中,應該出如今mid左側,則調整右邊界,h = mid - 1xml
(3) a[mid] ==key,中間值等於key,而要求的是最後一次出現的key。最後出現的v值必定在mid的右邊或者就是mid位置的這個值,因此咱們應該調整左邊界,l = mid。遞歸
java實現:
it
package cn.edu.ytu.botao.java.sort; /** * 折半查找 也爲二分查找 * 前提 : 要包含查找元素的數組必須是已經排好序的數組 * @author botao * */ public class BinarySearch { public static void main(String[] args) { int key = 9; int[] arr = {1,3,4,5,7,8,9,9,11,13,18}; BinarySearch binarySearch = new BinarySearch(); binarySearch.binarySearch(arr, key, 0, arr.length-1); } /** * * @param arr 須要查找的數組 * @param key 要查找的關鍵字 * @param low 數組開始下標 * @param high 數組結束下標 */ public void binarySearch(int[] arr,int key,int low,int high) { //取數組的中間元素和key進行比較 int mid = (low + high)/2; System.out.println("mid : " + mid); //遞歸的終止條件 if (low > high) { return ; }else { //若是中 arr[mid] == key 查找成功返回 直接輸出元素的位置便可 if (key == arr[mid]) { System.out.println("元素的位置 : " + mid); return ; //找到後返回 } /** *接下來 arr[mid] != key 而後判斷 key大於仍是小於arr[mid] 若key > arr[mid] 說明若是該key存在該數組中 則key存在於 arr[mind+1] --- arr[high]中 *若key < arr[mid] 說明若是該key存在該數組中 則key存在於 arr[low] --- arr[mid-1]中 * */ //在左邊的數組進行尋找 if (key < arr[mid]) { //而後進行遞歸 binarySearch(arr, key, low, mid-1); } //在右邊的數組進行查找 if (key > arr[mid]) { //對右邊的數組進行遞歸 binarySearch(arr, key, mid+1, high); } } } }