目前在剑指offer中遇到的题和常用的折半查找算法,如果再遇到再追加总结
##一般的折半查找算法
package althorgrim; /** * 1、必须采用顺序存储结果 * 2、关键字必须有序 */ public class TestBinarySearch { public static int binarySearch(int a[],int goal){ int high=a.length-1; // 设定最高位置的下标 int low=0; // 设定最低位置的下标 while (low<=high) { // 如果low》high则跳出,就是没找到 int middle=(low+high)/2; // 设定中间位置的下标 if (a[middle]==goal) { // 如果中间正好是,那么直接返回位置就好 return middle; } else if (a[middle]>goal) { //如果中间值大于该值,说明该值在中间值左边区间,所以令high=middle-1,在左侧区间继续查找 high=middle-1; } else { //如果中间值小于该值,说明该值在中间值右边区间,所以令high=middle-1,在右侧区间继续查找 low=middle+1; } } return -1; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] src = new int[] {1, 3, 5, 7, 8, 9}; System.out.println(binarySearch(src, 3)); } }
##旋转数组的折半查找算法
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
package Arrays; public class Solution { public int minNumberInRotateArray(int[] array) { int low = 0 ; int high = array.length - 1; //分别是第一个元素和最后一个元素的下标 while(low <= high){ int mid = (high + low) / 2; //获取了中间元素的下标 if(array[mid] > array[high]){ //如果中间元素大于最高的,说明最小值在中间元素右边 low = mid + 1; }else if(array[mid] == array[high]){ high = high - 1; }else{ high = mid;//如果中间元素小于最高的,说明最小值在中间元素左边或者就是中间元素 } } return array[low]; } public static void main(String[] args) { int[] array = { 3, 4, 5, 2, 2,3 }; Solution s = new Solution(); System.out.println(s.minNumberInRotateArray(array)); } }