zoukankan      html  css  js  c++  java
  • 顺序查找,二分法查找,插值查找算法实现及分析

    public class BinarySearch {

    public static void main(String[] args) {

        int []arr={1,3,8,66,148,155};

        System.out.println(binarySearch(arr,8));

        System.out.println(search(arr,0,arr.length-1,8));

        System.out.println(sequential_search(arr,8));

    }

    /**

     * 顺序(线性)查找算法

      最好查找一次,最差查找n次.平均(n+1)/2

     * 时间复杂度:O[n]

      

     * */

    public  static int sequential_search(int[]arr,int des){

      //判断如果查找的值是第一个的话直接返回

      if(arr[0]==des){

      return 0;

      }

      arr[0]=des;//哨兵,返回值为0,说明没找到.对for循环的优化

      int index=arr.length-1;

      //从最后一个元素开始遍历

      while(arr[index]!=des){

        index--;

      }

      return index;

    }

    /**

     * 二分查找算法:

     * 要求:有序,线性结构

     * 时间复杂度O[log(n)]

     循环实现

     * */

    public static int binarySearch(int []arr,int des){

        int low=0;

        int high=arr.length-1;

        while(low<high){

          int middle=(low+high)/2;

          //先拿中间的值与查找的值比较,大于中间的值,说明查找的值索引在[low,middle)

          if(des==arr[middle]){

          return middle;

        }else if(des<arr[middle]){

          high=middle-1;

        }else{

          high=middle+1;

      }

      }

      return -1;

    }

    /**

     * 二分查找算法:

     * 要求:有序,线性结构

     * 时间复杂度O[log(n)]

     *递归实现

     * */

    public static int binarySearch(int[]arr,int begin,int end,int des){

        if(des<arr[begin]||des>arr[end]||begin>end){

          return -1;

        }

        int middle=(begin+end)/2;

        if(des<arr[middle]){

          return binarySearch(arr,begin,middle-1,des);

        }else if(des>arr[middle]){

          return binarySearch(arr,middle+1,end,des);

        }else{

        return middle;

    }

    }

    /**

     * 时间复杂度O[log(n)],好于二分查找

     * 插值查找算法

     * */

    public static int search(int[]arr,int begin,int end,int des){

        if(des<arr[begin]||des>arr[end]||begin>end){

        return -1;

        }

        int middle=begin+(end-begin)*(des-arr[begin])/(arr[end]-arr[begin]);//和二分法的区别,就是在查找区间的选择上

        if(des<arr[middle]){

        return binarySearch(arr,begin,middle-1,des);

        }else if(des>arr[middle]){

          return binarySearch(arr,middle+1,end,des);

        }else{

        return middle;

    }

    }

    }

  • 相关阅读:
    进程-线程-消息队列
    用Ogre实现《天龙八部》场景中水面(TerrainLiquid)详解
    TCP协议三次握手过程分析【图解,简单清晰】
    excel批量删除sql语句
    批量删除指定盘指定格式文件
    Linux命令速查手册(第2版)学习
    List、Map、Set 三个接口,存取元素时,各有什么特点
    HashMap 什么时候进行扩容呢
    两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对?
    ArrayList,Vector, LinkedList 的存储性能和特性
  • 原文地址:https://www.cnblogs.com/2nao/p/6416820.html
Copyright © 2011-2022 走看看