码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习之二分查找算法

时间:2016-01-23 23:06:50      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

自己写的代码:

 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学习之二分查找算法

标签:

原文地址:http://www.cnblogs.com/ganhang-acm/p/5154228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!