面试四: 查找排序

    面试官还问了我另一个问题,就是给我一个严格递增或是严格递减的数组,让我将里面的某个数据取出来,这不就是折半查找吗?
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);
			}
		}

	}
}
相关文章
相关标签/搜索