标签:
好久没写算法了。只记得递归方法。。结果测试下爆栈了。
思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的。
自己写的代码:
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 }
标签:
原文地址:http://www.cnblogs.com/ganhang-acm/p/5154228.html