Java学习之二分查找算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     }

 

以上是关于Java学习之二分查找算法的主要内容,如果未能解决你的问题,请参考以下文章

递归分治算法之二维数组二分查找(Java版本)

算法图解(二分查找)

疯狂学java的第六天

4.机器学习之逻辑回归算法

python学习之第四天补充

java 二分查找法