面試四: 查找排序

    面試官還問了我另一個問題,就是給我一個嚴格遞增或是嚴格遞減的數組,讓我將裏面的某個數據取出來,這不就是折半查找嗎?
java

    下面我就整理一下二分查找:
面試

    算法複雜度:折半搜索每次把搜索區域減小一半,時間複雜度爲O\left( \log n  \right)。(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);
			}
		}

	}
}
相關文章
相關標籤/搜索