「java二分法查找比较」二分查找法java代码

博主:adminadmin 2022-11-29 16:40:12 52

今天给各位分享java二分法查找比较的知识,其中也会对二分查找法java代码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java计算2分法查找次数

2分法查找,前提是要有序,要排序,必然要比较大小,所以只要一个类它实现了Comparable接口的compareTo(T

o)方法(Comparable在java.lang包中)或是实现一个比较器对象接口Comparator(Comparator在java.util包),都可以进行比较了。不管是String型,计本数据类型,还是其他什么的,都可以用2分发查找了。给你看看API

java.util.Collections中2分法的API

binarySearch

public

static

T

int

binarySearch(List?

extends

Comparable?

super

T

list,

T

key)使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过

sort(List)

方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。

此方法对“随机访问”列表运行

log(n)

次(它提供接近固定时间的位置访问)。如果指定列表没有实现

RandomAccess

接口并且是一个大型列表,则此方法将执行基于迭代器的二分搜索,执行

O(n)

次链接遍历和

O(log

n)

次元素比较。

参数:

list

-

要搜索的列表。

key

-

要搜索的键。

返回:

如果搜索键包含在列表中,则返回搜索键的索引;否则返回

(-(插入点)

-

1)。插入点

被定义为将键插入列表的那一点:即第一个大于此键的元素索引;如果列表中的所有元素都小于指定的键,则为

list.size()。注意,这保证了当且仅当此键被找到时,返回的值将

=

0。

抛出:

ClassCastException

-

如果列表中包含不可相互比较

的元素(例如,字符串和整数),或者搜索键无法与列表的元素进行相互比较。

怎么计算java二分法查找的比较次数

您好,我来为您解答:

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。

希望我的回答对你有帮助。

java二分法查找的递归算法怎么实现

什么是二分查找?

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找优缺点

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

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:查找序列是顺序结构,有序。

过程

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

利用循环的方式实现二分法查找

public class BinarySearch {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println("产生的随机数组为: " + Arrays.toString(array));

System.out.println("要进行查找的值: ");

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim);

System.out.println("查找的值的索引位置: " + index);

}

/**     * 生成一个随机数组     *

* @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找  ---循环的方式实现     *

* @param array 要查找的数组     * @param aim 要查找的值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim) {

// 数组最小索引值        int left = 0;

// 数组最大索引值        int right = array.length - 1;

int mid;

while (left = right) {

mid = (left + right) / 2;

// 若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围            if (aim array[mid]) {

right = mid - 1;

// 若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围            } else if (aim array[mid]) {

left = mid + 1;

// 若查找数据与中间元素值正好相等,则放回中间元素值的索引            } else {

return mid;

}

}

return -1;

}}

运行结果演示:

由以上运行结果我们得知,如果要查找的数据在数组中存在,则输出该数据在数组中的索引;如果不存在则输出 -1 ,也就是打印 -1 则该数在数组中不存在,反之则存在。

四、利用递归的方式实现二分法查找

public class BinarySearch2 {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println("产生的随机数组为: " + Arrays.toString(array));

System.out.println("要进行查找的值: ");

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim, 0, array.length - 1);

System.out.println("查找的值的索引位置: " + index);

}

/**     * 生成一个随机数组     *     * @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// Random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找 ---递归的方式     *     * @param array 要查找的数组     * @param aim   要查找的值     * @param left  左边最小值     * @param right 右边最大值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim, int left, int right) {

if (aim array[left] || aim array[right]) {

return -1;

}

// 找中间值        int mid = (left + right) / 2;

if (array[mid] == aim) {

return mid;

} else if (array[mid] aim) {

//如果中间值大于要找的值则从左边一半继续递归            return binarySearch(array, aim, left, mid - 1);

} else {

//如果中间值小于要找的值则从右边一半继续递归            return binarySearch(array, aim, mid + 1, array.length-1);

}

}}

运行结果演示:

总结:

递归相较于循环,代码比较简洁,但是时间和空间消耗比较大,效率低。在实际的学习与工作中,根据情况选择使用。通常我们如果使用循环实现代码只要不是太繁琐都选择循环的方式实现~

什么叫java中的二分查找法

1、算法概念。

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

2、算法思想。

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

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

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

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

3、实现思路。

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

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

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

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

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

4、实现代码。

/**

     * description : 二分查找。

     * @param array 需要查找的有序数组

     * @param from 起始下标

     * @param to 终止下标

     * @param key 需要查找的关键字

     * @return

     */

    public static E extends ComparableE 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);

    }

Java二分法

首先得告诉你,二分法的前提是必须是顺序方式存储,而且必须是排好序了的。比如要从100个数中查找某一个数,前提是这一百个数是排好序(这里假如从小到大)的,然后找到最中间的数,若最中间的数(这里是第50个)比你要找的这个数大那你只需要在1到49个数里找,然后再取最中间的数,再判断,如此往复下去,最多次数,你算算看,

java二分法查找比较的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于二分查找法java代码、java二分法查找比较的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-29,除非注明,否则均为首码项目网原创文章,转载请注明出处。