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     }
时间: 2024-08-05 11:14:53

Java学习之二分查找算法的相关文章

Java集合中二分查找算法实现

Arrays.binarySearch实现了对有序数组特定区间的二分查找,虽然我们觉得很简单,但是阅读源码的确能看到实现这些库的优秀技巧,总是在追求完美和高效. 值得学习的地方有: (1)边界检查: (2)求中位数的时候使用位移操作,而不是 x/2; (3)如果查找的元素不在数组中,通过返回值昭示了应该插入的位置,而不是直接返回-1: public static int binarySearch(int[] a, int fromIndex, int toIndex, int key) { ra

JAVA学习笔记----二分查找递归

public class Main{     public static int rank(int key, int[] a){         return rank(key,a, 0 ,a.length -1 );     }     public static int rank(int key, int[] a, int lo , int hi){         if (lo > hi){System.out.println(" 找不到 ");return -1;}   

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

javascript学习6-练习之3二分查找算法

二分查找算法,对数据进行查找并且显示位置. 核心思想:将所查找数据与查询数组中间的数进行比较,findVal<midVal,则在左边进行二分查找,否则在右边进行二分查找递归调用 具体代码如下: 1 //二分查找 2 var string2=[1,3,42,88,123,143]; 3 var leftIndex=0; 4 var rightIndex=5; 5 function binarySearch(string2,findVal,leftIndex,rightIndex) 6 { 7 if

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg

Java二分查找算法

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

二分查找算法(JAVA)

1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分. 4.实现:二分查找的实现用递归和循环两种方式 5.代码: 1 package other; 2

二分查找算法java

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除