Java实现二分查找算法

二分查找:
两种方式: 非递归方式和递归方式
主要思路: 对于已排序的数组(先假定是从小到大排序), 先定义两个"指针", 一个"指向"首元素low, 一个"指向"末尾元素high.
然后, 开始折半比较, 即让要查找的数与数组中间的元素(索引为 low+high/2)比较. 若要查找的数比中间数小,
说明要查找的数在数组左侧(注意前提是数组从小到大排序), 否则说明该数在数组的右侧. 如果low最后还比high大,
俩"指针"交叉了, 说明没有找到该数, 即数组不存在该数.

注意事项: 排序规则与数组的排序顺序有关, 即从大到小排序和从小到大排序是不一样的!!!

 1 class BinarySearch {
 2
 3     // 二分查找非递归方式
 4     // arr 给定已排序数组
 5     // num 要查找的数
 6     public static int search(int[] arr, int num) {
 7         int low = 0;
 8         int high = arr.length - 1;
 9         int mid = 0;
10         while (low <= high) {
11             mid = (low + high) / 2;
12             if (num < arr[mid]) {
13                 high = mid - 1;
14             }
15
16             if (num > arr[mid]) {
17                 low = mid + 1;
18             }
19             if (num == arr[mid]) {
20                 return mid;
21             }
22         }
23         return -1;    // 没找到
24     }
25
26
27     // 二分查找递归方式
28     // arr 给定已排序数组
29     // num 要查找的数
30     // low 初始左侧指针 指向第一个元素
31     // high 初始末尾指针 指向最后一个元素
32     public static int binarySearch(int[] arr, int num, int low, int high) {
33
34         int mid = (low + high) / 2;
35
36         // 递归结束条件
37         if (low > high) {
38             return -1;
39         }
40
41         if (num < arr[mid]) {
42             return binarySearch(arr, num, low, mid - 1);
43         } else if (num == arr[mid]) {
44             return mid;
45         } else {
46             return binarySearch(arr, num, mid + 1, high);
47         }
48
49     }
50
51
52     public static void main(String[] args) {
53
54         // 给定数组 从小到大排序.
55         int[] arr = {2, 3, 5, 7, 8, 9, 11, 12, 15};
56         // int[] arr = {15, 12, 11, 9, 8, 7, 5, 3, 2};
57
58         int m = 3;
59
60         // int index = search(arr, m);
61
62         int index = binarySearch(arr, m, 0, arr.length - 1);
63
64         System.out.println(index);
65
66     }
67
68 }

原文地址:https://www.cnblogs.com/hejjon/p/11483786.html

时间: 2024-10-07 02:37:13

Java实现二分查找算法的相关文章

java基础 二分查找算法

/*   * 折半查找法:   * 思路:   * 定义三个变量记录查找范围中最大.最小和中间的索引值,每次都是使用中间索引值与要查找的目标进行对比,如果不符合,那么就不停缩小查找范围   * */  //前提:查找的序列必须是有序的  int[] arr1 = {3,5,7,10,22,45,191};  //定义三个变量记录查找的边界和中间位置,并且初始化  int min = 0;  int max = arr1.length;  int mid = (min + max)/2;  //定

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 mai

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

Java二分查找算法

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

二分查找算法java实现

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

二分查找算法(JAVA)

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

二分查找算法java

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

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

二分查找算法

提到查找算法,最经典的就是二分查找算法了.在二分查找时要在有序的数据里查找目标target,先取中间元素与target比较, 当target小于中间元素的时候,则搜索数组的前半部分,target大于中间元素时,则取数组的后半部分.重复整个搜索的过程 将左半部分与有半部分当作子数组继续查找,直到找到元素或到子数组的大小为0停止. 原理上很简单却有较多细节,尤其是数据边界的取值是否会越界,while循环的条件. java code: public class BinarySearchDemo { p