• 顺序查找,二分法查找,插值查找算法实现及分析


    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;

    }

    }

    }

  • 相关阅读:
    [Chrome扩展]屏蔽Google搜索结果重定向
    [Winform/C#]点击工作区域移动窗体
    [Silverlight]键盘钩子KeyboardHook
    (python笔记)模拟手机apk卸载安装
    设备管理系统在Sharepoint2007上的开发再准备
    设备管理系统在Sharepoint2007上的开发 准备
    做了好久的小白,总算知道LiveWriter也可以在Cnblogs上发布日志了,方便
    Bertini的车子不好找啊
    Baby用的护肤霜
    出离愤怒的飙车
  • 原文地址:https://www.cnblogs.com/2nao/p/6416820.html
Copyright © 2020-2023  润新知