【基础算法 二】查找算法

简介: 【基础算法 二】查找算法

目前在剑指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));
  }
}


相关文章
|
6月前
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
113 0
|
人工智能 算法
【AcWing算法基础课】第一章 基础算法(部分待更)(3)
输入n个字符串(不含空格),由空格隔开。每行依次输出每个字符串。
76 0
|
6月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
6月前
|
人工智能 算法 BI
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
|
6月前
|
存储 算法 索引
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
|
6月前
|
算法 搜索推荐
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
|
存储 人工智能 移动开发
【AcWing算法基础课】第一章 基础算法(部分待更)(2)
除法是从最高位开始算,可以正序存储,但是为了与加减乘统一,以及题目中存在四则运算时比较方便,也使用倒序存储每位信息。
122 0
|
6月前
|
算法 Python
Python基础算法解析:K最近邻算法
Python基础算法解析:K最近邻算法
76 2
|
存储 算法
基础算法 - 常见算法模板题(最简洁写法)【下】
基础算法 - 常见算法模板题(最简洁写法)【下】
|
存储 算法
【AcWing算法基础课】第一章 基础算法(部分待更)(1)
课上理解算法的 主要思想。 课下 背过(能写出来并调试通过即可) 模板。 提高熟练度方法:一个模板题 重复3~5次 AC通过。
179 0