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