zoukankan      html  css  js  c++  java
  • Java学习之二分查找算法

     好久没写算法了。只记得递归方法。。结果测试下爆栈了。

    思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的。

    自己写的代码:

     1 package com.gh;
     2 
     3 import java.util.Arrays;
     4 /**
     5  * 二分查找算法实现
     6  * @author ganhang
     7  *
     8  */
     9 public class Search {
    10     public static void main(String[] args) {
    11         search1(0, 10000, 20000);
    12         if(search2(0,2100000001,200000100)){
    13             System.out.println("找到了!");
    14         }
    15         else System.out.println("没找到!");
    16     }
    17     /**
    18      * 懒得传数组,直接在a到b找n。。。
    19      * 发现比数组的二分容易实现点
    20      * @param a
    21      * @param b
    22      * @param n
    23      */
    24     //想法太native递归爆栈了
    25     public static void search1(int a, int b, int n) {
    26         int tmp = (int) (a + b) / 2;
    27         if (a == tmp || b == tmp) {
    28             System.out.println("没找到!");
    29             return;
    30         }
    31         if (n == tmp) {
    32             System.out.println("找到了!");
    33         } else if (n > tmp)
    34             search1(tmp, b, n);
    35         else if (n < tmp)
    36             search1(a, tmp, n);
    37     }
    38     //递推实现
    39     public static boolean search2(int a,int b,int n) {
    40         int tmp;
    41         while(true){
    42             tmp=(int)(a+b)/2;
    43             if(n==tmp)return true;
    44             else if(n>tmp){a=tmp;}
    45             else if(n<tmp){b=tmp;}
    46             if(a==b)return false;
    47         }
    48     }
    49 }

    对比Arrays工具类的二分查找,自己注释了下

     1   private static int binarySearch0(int[] a, int fromIndex, int toIndex,
     2                                      int key) {
     3         int low = fromIndex;
     4         int high = toIndex - 1;// 一般是a的length-1,java里一般头封尾不封
     5 
     6         while (low <= high) {
     7             int mid = (low + high) >>> 1;//无符号右移一位相当于除2,但速度快点
     8             int midVal = a[mid];
     9 
    10             if (midVal < key)
    11                 low = mid + 1;//优化
    12             else if (midVal > key)
    13                 high = mid - 1;//优化
    14             else
    15                 return mid; // key found返回下标
    16         }
    17         return -(low + 1);  // key not found.返回负数表示没找到,这技巧6
    18     }
  • 相关阅读:
    【交换】
    【数字对】
    【改造二叉树】
    【Begin】
    100以内所有质数的输出
    位运算符、|和||、&和&&的区别
    linux中vim编辑器三种模式及常用命令的使用
    静态代码块、构造代码块和构造函数的执行顺序
    字符乱码出现的原因及解决办法
    Springcloud-微服务
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5154228.html
Copyright © 2011-2022 走看看