算法---查找算法

来源:互联网 发布:ubuntu双系统分区方案 编辑:程序博客网 时间:2024/06/03 14:59

目前在剑指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));    }}
原创粉丝点击