Java实现二分法查找算法

[ 什么是二分查找 ]

二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象,

如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。以此类推不断缩小搜索范围。

[ 二分查找的条件 ]

二分查找的先决条件是查找的数列必须是有序的。

[ 二分查找的优缺点 ]

优点:比较次数少,查找速度快,平均性能好;

缺点:要求待查数列为有序,且插入删除困难;

适用场景:不经常变动而查找频繁的有序列表。

[ 算法步骤描述 ]

① 首先确定整个查找区间的中间位置 mid = (min + max)/ 2

② 用待查关键字值与中间位置的关键字值进行比较:

i. 若相等,则查找成功;

ii. 若小于,则在前半个区域继续进行折半查找;

iii. 若大于,则在后半个区域继续进行折半查找;

③ 对确定的缩小区域再按折半公式,重复上述步骤。

④ 最后得到结果:要么查找成功,要么查找失败。折半查找的存储结构采用一维数组存放。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

[ Java实现 ]

public class BinarySearch {
    public static int binarySearch(int[] arr, int target) {
        if (arr != null) {
            int min, mid, max;
            min = 0; // the minimum index
            max = arr.length - 1; // the maximum index
            while (min <= max) {
                mid = (min + max) / 2; // the middle index
                if (arr[mid] < target) {
                    min = mid + 1;
                } else if (arr[mid] > target) {
                    max = mid - 1;
                } else {
                    return mid;
                }
            }
        }
        return -1;
    }  

    // test case
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 5, 6, 7, 8, 9, 23, 34 };
        System.out.println(binarySearch(arr, 5));
        System.out.println(binarySearch(arr, 23));
        System.out.println(binarySearch(arr, 0));
        System.out.println(binarySearch(arr, 35));
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 区间查找
, java算法
, binarysearch
, 二分法
, arr
, 折半查找
, 数据库 值 二分查找
, 递归二分查找算法
, 查找算法
, 二分图集合算法
, println
, 有序
数列
java二分法查找算法、java实现查找算法、二分法查找算法、c语言二分法查找算法、js数组二分法查找算法,以便于您获取更多的相关知识。

时间: 2024-11-01 21:40:25

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

Java实现二分查找算法实例分析_java

本文实例讲述了Java实现二分查找算法.分享给大家供大家参考.具体如下: 1. 前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2. 原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分.可能描述得不是很清楚,若是不理解可以去网上找.从描述上就可以看出这个算法适合

Java实现二分查找算法

Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分.可能描述得不是很清楚,若是不理解可以去网上找.从描述上就可以看出这个算法适合用递归来实现,可以用递归的都可以用循环来实

Java使用二分法进行查找和排序的示例_java

实现二分法查找二分法查找,需要数组内是一个有序的序列 二分查找比线性查找:数组的元素数越多,效率提高的越明显 二分查找的效率表示:O(log2N) N在2的M次幂范围,那查找的次数最大就是M,  log2N表示2的M次幂等于N, 省略常数,简写成O(logN) 如有一个200个元素的有序数组,那么二分查找的最大次数: 2^7=128, 2^8=256, 可以看出7次幂达不到200,8次幂包括, 所以最大查找次数就等于8 //循环,二分查找 static int binarySearch(int[

深入JDK源码之Arrays类中的排序查找算法(转)

原文出处: 陶邦仁 binarySearch()方法 二分法查找算法,算法思想:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的. 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功:若x小于当前位置值,则在数列的前半段中查找:若x大于当前位置值则在数列的后半段中继续查找,直到找到为止. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //针对int类型数组的二分法查找,key为要查找数的下

Java 查找算法

这个问题有几个点要先确认 必须是有序,如果无序的话就只能全遍历了 查找算法跟数据结构相关,不同的数据结构适用于不同的查找算法 查找算法与磁盘I/O有一定的关系,比如数据库在索引排序的时候,如果每次都从磁盘读取一个节点然后进行判断 数组 如果知道下标的话就方便了,查找的复杂度为1. 如果是针对值的查找,那么顺序遍历是O(n), 二分查找 使用二分查找的话可以减少时间复杂度为:O(logn) /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构

php数据结构与算法(PHP描述) 查找与二分法查找_php技巧

复制代码 代码如下: <?php /** * 查找 * **/ // 顺序查找 function normal_search($arrData,$val) { $len = count($arrData); if($len == 0) return -1; for($i = 0;$i < $len; $i++ ) { echo "find No.",$i + 1," value = ",$arrData[$i]," is = ",$v

Android中关于递归和二分法的算法实例代码_Android

// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9,11,45}; int index=findIndext(arr,0,arr.length-1,12); System.out.println("index="+index); } // 1

php二分法查找数组是否包含某一元素

 二分法查找数组是否包含某一元素,兼容正反序,代码实现:  代码如下: <?php $searchValue = (int)$_GET['key']; function search(array $array, $value) { $max = count($array)-1; $min = 0; $isAscSort = $array[$min] < $array[$max]; while (TRUE) { $sum = $min+$max; $midKey = (int)($sum%2 =

基于Hash的查找算法实现

package da; public class MyMap< K, V> { private int size;// 当前容量 private static int INIT_CAPACITY = 16;// 默认容量 private Entry< K, V>[] container;// 实际存储数据的数组对象 private static float LOAD_FACTOR = 0.75f;// 装载因子 private int max;// 能存的最大的数=capacity