二分法查找,顾名思义就是要将数据每次都分成两份然后再去找到你想要的数据,我们可以这样去想,二分法查找很类似与我们平时玩的猜价格游戏,当你报出一个价格时裁判会告诉你价格相对于真实值的高低,倘若是低了那我们一定会再说出一个略高的价格,反之亦然。在二分法查找时要求传入的数据必须已经有序,假设现在为升序,然后每次将所寻找的值与中间值(数组左边界+(右边界——左边界)/2)作比较,大了则去寻找中间值左侧数据,小则寻找中间值右侧数据。
二分法查找比较局限性的就是只能操作一个已经排序了的数组。
<强>方法一强>
下面为一个二分法实现的完整代码
包的二分法; 进口java.util.Arrays; 进口java.util.Scanner; 进口静态java.lang.System.out; 公开课Erchange { 私有静态扫描; 公共int找到(int [], int b)//为所要查找的数 { int中期、低=0,高; 高=a.length-1; 而(low<=高) { 中期=低+(高低)/2; 如果(b<[中]) { 高=mid-1; } else if (b>[中]) { 低=中期+ 1; } 其他的 { 返回中期+ 1; } } 返回0; } 公共静态void main (String [] args) { int []; int t; int和=0; 新Erchange Erchange p=(); int q2=0;=新扫描仪(系统); out.println(“请输入数组长度”); q2=in.nextInt ();=new int (q2); out.println(“请输入数组元素”); for (int i=0; i<强>方法二强>
代码实现:
公开课BinarySearch {//进行二分法查找的前提是数组已经有序! 公共静态int排名(int, int num []) {//查找范围的上下界 int低=0; int高=nums.length-1;//未查找到的返回值 int notFind=1; 而(low<=高) {//二分中点=数组左边界+(右边界——左边界)/2//整数类型默认取下整 int中期=低+(高低)/2;//中间值是如果大于关键 如果(num(中期)在键) {//证明关键在[低,mid-1]这个区间//因为num(中期)已经判断过了所以下界要减一 高=mid-1; }else if (num[中]& lt;键) {//证明关键在[+ 1,中期高]这个区间//同样判断过中期对应的值要从+ 1往中期后判断 低=中期+ 1; } 其他的 {//查找成功 返回中期; } }//未成功 返回notFind; } 公共静态void main (String [] args) { System.out.println(“请输入数据数量:”); 扫描仪扫描仪=new扫描仪(系统); int金额=scanner.nextInt (); int num; int num []=new int(数量); int i=0; 而(i<数量) { num[我]=scanner.nextInt (); 我+ +; } Arrays.sort (num); System.out.println(“请输入想要查找的值”); int关键=scanner.nextInt (); int回答=排名(关键,num); 如果(答案!=1) { System.out.println(“所查找的数据存在:”+ num[答案]); } 其他的 { System.out.println(“您所查找的数据不存在”); } } } >之前<强>方法三,算法代码实现之二分法查找强>
封装成类:
包com.roc.algorithms.search;/* * *二分法查找 * * @author中华民国 */公开课BinarySearch {/* * * @param升序排列的数组 * @param k待查找的整数 * @return如果查到有就返回对应角标,没有就返回1 */公共静态int搜索(int [], int k) { int lo=0,你好=3ざ? 1; 而(lo & lt;=你好){ int m=(lo +嗨)在祝辞1; 如果([m] & lt;k) { lo=m + 1; }else if ([m]比;k) { 你好=m - 1; 其他}{ 返回m; } } 返回1; } }java实现二分法的完整代码