介绍
小编给大家分享一下Java怎么实现二分查找的变种,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
Java的优点是什么
1。简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2。面向对象;3。分布性,Java是面向网络的语言;4。鲁棒性、java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。5。安全性,用于网络,分布环境下的Java必须防止病毒的入侵。6。体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7。可移植性、Java可以方便地移植到网络上的不同机器。8。解释执行,Java解释器直接对Java字节码进行解释执行。
具体内容如下
<>强普通二分查找:强>
先回顾一下普通的二分查找
注意:二分查找有这样一个问题:当数组中数有重复时,比如{3,3,3,3}这个数组,二分查找3时,返回的是加勒比海盗[1],也就是说二分查找并不会返回3第一次出现的位置0。
public class BinarySearch { public 才能static & lt; T extends Comparable<?, super T>祝辞,int 搜索(T arr [], T 价值),{ ,,,int left =, 0; ,,,int right =, arr.length 作用;1; ,,,while (left & lt;=,右),{ ,,,,,int mid =, (left ,,右),+,((^ left 右),在祝辞,1); ,,,,,if (arr(中期).compareTo(值),==,0),{ ,,,,,,,return 中期; ,,,,,},else if (arr(中期).compareTo(值),祝辞,0),{ ,,,,,,,right =, mid 作用;1; ,,,,,},{else ,,,,,,,left =, mid +, 1; ,,,,,} ,,,} ,,,return 1; ,,} , public 才能;static  void main (String [], args), { ,,,整数[],arr =, new 整数[]{1,,3,,3,,6日,7日,9}; , ,,,//1 ,,,System.out.println(搜索(加勒比海盗,0)); , ,,,//0 ,,,System.out.println(搜索(加勒比海盗,1)); , ,,,//5 ,,,System.out.println(搜索(加勒比海盗,9)); , ,,,//1 ,,,System.out.println(搜索(加勒比海盗,10)); , ,,,//2 ,,,System.out.println(搜索(加勒比海盗,3)); ,,} }
<强>二分变种:findFirst函数强>
在普通二分查找中,在(左....右)左闭右闭区间中查找,如果找到了值为价值的元素就认为找到了。而在这个findFirst函数中就不是如此,在[左....右)左闭右闭区间中查找,当找到值等于价值的元素后,不是让右=1,中期而是让右=中期,继续在[左....正确的)左闭右闭区间中查找。最终左==右时就退出循环。
退出循环后可能找到值了值,也有可能是循环遍历完整个数组后都没找到价值,而退出循环。
所以退出循环后还要在判断一下是那种情况。
public class BinarySearch { public 才能static & lt; T extends Comparable<?, super T>祝辞,int findFirst (T arr [], T 价值),{ ,,,int left =, 0; ,,,int right =, arr.length 作用;1; ,,,//当left>=正确时退出,这里的"="情况与二分不同 ,,,while (left & lt;,右),{ ,,,,,int mid =,(时间+ left 右),在祝辞,1; ,,,,,if (arr(中期).compareTo(值),& lt;, 0), { ,,,,,,,left =, mid +, 1; ,,,,,},{else ,,,,,,,right =,中期; ,,,,,} ,,,} ,,,//,上面循环遍历完后。是找到值了价值?还是没找到价值值?判断一下。 ,,,if (arr(左),==,值),{ ,,,,,return ; ,,,},{else ,,,,,return 1; ,,,} ,,} , public 才能;static  void main (String [], args), { ,,,整数[],arr =, new 整数[]{1,3,3,3,3,3,3,3,3,3,6日,7日,9}; , ,,,//1 ,,,System.out.println (findFirst(加勒比海盗,0)); , ,,,//0 ,,,System.out.println (findFirst(加勒比海盗,1)); , ,,,//12 ,,,System.out.println (findFirst(加勒比海盗,9)); , ,,,//1 ,,,System.out.println (findFirst(加勒比海盗,10)); , ,,,//1 ,,,System.out.println (findFirst(加勒比海盗,3)); ,,} null null null null null null null null null null null null null null null null null null null null null null nullJava怎么实现二分查找的变种