zoukankan      html  css  js  c++  java
  • java算法每日一练2021/1/23

    1.顺序查找

    /**
    * 顺序查找
    * 时间复杂度O(n)
    * @param args
    */
    public static void main(String[] args) {
    int[] nums = {1,1,5,13,6,9,8};
    System.out.println("该数值所在下标为:"+search(nums,13));
    }
    public static int search(int[] nums, int num){
    int length = nums.length;
    for(int i = 0; i < length; i++){
    if(num == nums[i]){
    return i;
    }
    }
    return -1;
    }
    2.二分查找
    /**
    * 二分查找 时间复杂度O(logn),存储结构必须是顺序存储 ,数据有序
    * @param args
    */
    public static void main(String[] args) {
    int[] nums = {1,2,3,6,7,8,10};
    System.out.println("该数值所在下标为:"+search(nums,13));
    }
    public static int search(int[] nums, int num){
    int low = 1;
    int high = nums.length-1;
    while(low<=high) {
    int mid = (low+high)/2;
    if(nums[mid]<num)
    low=mid+1; //要+1
    else if(nums[mid]>num)
    high=mid-1; //要-1
    else
    return mid;
    }
    return -1;
    }
    3.插值查找
    /**
    * 插值查找,对于表长较大,关键字分布比较均匀的查找表来说,可以采用
    * @param args
    */
    public static void main(String[] args) {
    int[] nums = {1,2,3,6,7,8,10};
    System.out.println("该数值所在下标为:"+search(nums,7));
    }
    public static int search(int[] nums, int num){
    int low = 1;
    int high = nums.length-1;
    while(low<=high) {
    int mid = low + (high - low) * (num - nums[low]) / (nums[high] - nums[low]);/*插值*/
    if(nums[mid]<num)
    low=mid+1; //要+1
    else if(nums[mid]>num)
    high=mid-1; //要-1
    else
    return mid;
    }
    return -1;
    }
    4.斐波那契查找
    /*
    * 斐波那契数列
    * 采用递归
    */
    public static int fib(int n) {
    if(n==0)
    return 0;
    if(n==1)
    return 1;
    return fib(n-1)+fib(n-2);
    }

    /*
    * 斐波那契数列
    * 不采用递归
    */
    public static int fib2(int n) {
    int a=0;
    int b=1;
    if(n==0)
    return a;
    if(n==1)
    return b;
    int c=0;
    for(int i=2;i<=n;i++) {
    c=a+b;
    a=b;
    b=c;
    }
    return c;
    }

    /*
    * 斐波那契查找
    */
    public static int fibSearch(int[] arr,int n,int key) {
    int low=1; //记录从1开始
    int high=n; //high不用等于fib(k)-1,效果相同
    int mid;

    int k=0;
    while(n>fib(k)-1) //获取k值
    k++;
    int[] temp = new int[fib(k)]; //因为无法直接对原数组arr[]增加长度,所以定义一个新的数组
    System.arraycopy(arr, 0, temp, 0, arr.length); //采用System.arraycopy()进行数组间的赋值
    for(int i=n+1;i<=fib(k)-1;i++) //对数组中新增的位置进行赋值
    temp[i]=temp[n];

    while(low<=high) {
    mid=low+fib(k-1)-1;
    if(temp[mid]>key) {
    high=mid-1;
    k=k-1;
    }else if(temp[mid]<key) {
    low=mid+1;
    k=k-2;
    }else {
    if(mid<=n)
    return mid;
    else
    return n; //当mid位于新增的数组中时,返回n
    }
    }
    return 0;
    }
    public static void main(String[] args) {
    int[] arr = {0,1,16,24,35,47,59,62,73,88,99};
    int n=10;
    int key=59;
    System.out.println(fibSearch(arr, n, key));
    }
  • 相关阅读:
    Lucene教程
    ElasticSearch安装
    MySQL事务
    Java泛型
    Python学习笔记(1)
    @keyframs实现图片gif效果
    glup简单应用---gulpfile.js
    巧用CSS3伪类选择器自定义checkbox和radio的样式
    get传中文参数乱码解决方法
    自定义样式 实现文件控件input[type='file']
  • 原文地址:https://www.cnblogs.com/mqlblog/p/14316568.html
Copyright © 2011-2022 走看看