java 实现二分法

http://www.cnblogs.com/vanezkw/archive/2012/06/29/2569470.html

JDK里面的二分法实现。二分法的实现有多种今天就给大家分享两种。一种是递归方式的,一种是非递归方式的。先来看看一些基础的东西。

1、算法概念。

二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。

2、算法思想。

①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;

②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

③如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

3、实现思路。

①找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp);

②需要找到的key和temp进行比较;

③如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复① ②。

④如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复① ② ③。

⑤如果key值等于temp,则返回数组下标,完成查找。

4、实现代码。


/**
     * description : 二分查找。
     * @autor kwzhang
     * modify :2012-6-29
     *
     * @param <E>
     * @param array 需要查找的有序数组
     * @param from 起始下标
     * @param to 终止下标
     * @param key 需要查找的关键字
     * @return
     * @throws Exception
     */
    public static <E extends Comparable<E>> int binarySearch(E[] array, int from, int to, E key) throws Exception {
        if (from < 0 || to < 0) {
            throw new IllegalArgumentException("params from & length must larger than 0 .");
        }
        if (from <= to) {
            int middle = (from >>> 1) + (to >>> 1); // 右移即除2
            E temp = array[middle];
            if (temp.compareTo(key) > 0) {
                to = middle - 1;
            } else if (temp.compareTo(key) < 0) {
                from = middle + 1;
            } else {
                return middle;
            }
        }
        return binarySearch(array, from, to, key);
    }


 

5、测试demo很简单,这里就不写了。

 

上面这种实现是通过递归的方式,各人觉得之类的问题用递归比较好理解,而且过程简单。

下面再来看看非递归的方式如何实现。在JDK里面正好有实现,在此就直接贴上Arrays里面的代码。为了简单起见,我们就只看看int参数的方法:


private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
    int low = fromIndex;
    int high = toIndex - 1;
    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = a[mid];
        if (midVal < key)
        low = mid + 1;
        else if (midVal > key)
        high = mid - 1;
        else
        return mid; // key found
    }
    return -(low + 1);  // key not found.
    }


 

相关链接:

二分法和冒泡法的比较(快速排序法)

数据结构之二分法查找、快速排序思想与实现

二分法 - 百度百科

百度搜索二分法

时间: 2024-08-10 16:57:32

java 实现二分法的相关文章

java的二分法查找数据

Java二分法查找的源代码:    二分查找是一种高效率线性表的查找算法.在查找时必须将线性表中的关键词排好序.基本思路是:先断定线性表的中心方位 mid=(first+last)/2:对比所要查找的关键词 key与中心方位的关键词的巨细,假如比key和mid.key持平则回来: key比mid.key大(假定为升序)这所要查找的关键词在mid和last之间:否则在first与mid之间.持续按照上面办法查找中心元素,直到找到为止.    详细完成如下package com.cgogo; /**

Java之二分法

废话不多说,先来程序.一步一步看注释, 首先要注意:使用二分法时,数组必须是有序的,也就是从大到小或者从小到大的,不能是无序的 1 public static int halfSearch(int[] arr,int key){ 2 int min,max,mid;//分别为最小值,最大值,和中间值 3 min = 0; 4 max = arr.length - 1; 5 mid = (max + min)/2;//这应该就是二分的核心了, 6 //当key = arr[mid]说明已经找到了这

java之二分法详解

废话不多说,先来程序.一步一步看注释, 首先要注意:使用二分法时,数组必须是有序的,也就是从大到小或者从小到大的,不能是无序的 public static int halfSearch(int[] arr,int key){             int min,max,mid;//分别为最小值,最大值,和中间值             min = 0;             max = arr.length - 1;             mid = (max + min)/2;//这应

Java 实现二分法查找算法

算法 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2. 1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36).因为mid>x,故应在前半段中查找. 2.令新的end=mid-1=2,而front=0不变,则新的mid=1.此时x>mid,故确定应在后半段中查找. 3.令新的front=mid+1=2,而end=2不变,则新的mid

Java基础——二分法

BinarySearch 二分法查找,顾名思义就是要将数据每次都分成两份然后再去找到你想要的数据,我们可以这样去想,二分法查找很类似与我们平时玩的猜价格游戏,当你报出一个价格时裁判会告诉你价格相对于真实值的高低,倘若是低了那我们一定会再说出一个略高的价格,反之亦然.在二分法查找时要求传入的数据必须已经有序,假设现在为升序,然后每次将所寻找的值与中间值(数组左边界+(右边界-左边界)/2)作比较,大了则去寻找中间值左侧数据,小则寻找中间值右侧数据. 算法:当数据量很大适宜采用该方法.采用二分法查找

Java实现二分法查找数组

public class binarySearchTest { public static void main(String[] args) { int[] a = {1,5,9,36,49,89,102}; int c = 49; int pos = binarySearch(a,c); System.out.println(pos); } private static int binarySearch(int[] a, int c) { if(a.length == 0) return -1

java的二分法求一个数的平方根

class Solution { public int mySqrt(int x) { // 注意:针对特殊测试用例,例如 2147395599 // 要把搜索的范围设置成长整型 // 为了照顾到 0 把左边界设置为 0 long left = 0; // # 为了照顾到 1 把右边界设置为 x // 2 + 1 long right = x / 2 + 1; //对于一个非负数n,它的平方根不会大于(n/2+1) while (left < right) { //在left与right中寻找

Java实现查找树(BST,AVL,BTree,Trie)

BST 二叉排序树是一种非常简单的排序树(或者说查找树) 包括两种操作 添加 添加的元素永远是叶子节点 删除 叶子节点,直接删除 非叶子节点 2.1. 只有左子树或者只有右子树,直接用左子树或者右子树代替待删除节点 2.2. 如果左右子树都存在,则将右子树接到左子树的最右边节点的右子树下,这样就依然保持了有序 import java.util.*; /* * 二分法查找 */ public class BST { public static Node root = null; public st

java学习-排序及加密签名时数据排序方式

排序有两种, 基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,用于列表List或数组arrays的排序 Comparable<Integer>接口方法的实现,对象列表的升序降序接口 我们通过重写改接口方法,可以对列表进行升序或降序排列. public int compareTo(T o); This interface imposes a total ordering on the objects of each clas