2021-07-26 09:23

二分法查找数据

Blk_J

JavaEE

(1429)

(0)

收藏

二分法是用来查找一个有序数组且不重复里的数据的方法,它的原理是:

1)先将一个数组按照从大到小(或者从小到大)的顺序排列。排序的方法有很多:冒泡排序、插入排序、选择排序或沉底排序等。

2)找到这个数组的中间值和位置。(最大值的序号+最小值的序号)/2为中间值的序号。

3)将要查找的数与中间值作对比,分3种情况:

        (1)要查找的值=中间值,找到了这个数;

        (2)要查找的值>中间值,说明这个值可能在当前数组的后半部分,将当前的最小值设为中间值的下一个值,重复步骤3;

        (3)要查找的值<中间值,说明这个值可能在当前数组的前半部分,将当前的最大值设为中间值的上一个值,重复步骤3;

4)如果最大值<=最小值,说明要查找的数不在这个数组里。


关键代码:

 int find = fun(a,num);                        //假设数组是a且已经按照从小到大的顺序排列好,num为要查找的数字,fun函数实现了二分法查找,最后返回给find。

    System.out.println();

    if(find==-1) {                                         //返回了-1说明数组a里没有num这个数

    System.out.println("没有找到!!!");

    }

    else {

    System.out.printf("要找的数是数组里的第%d个",find+1);

    }

}


private static int  fun(int[] a, int num) {

int min = 0;                                                //定义一个最小值的位置,因为是从小到大排列,所以第一次是第0个数

int max = a.length-1;                                //定义一个最大值的位置,第一次是最后一个数。

while(min<=max) {                                    //当条件不满足方法4时,用while反复执行方法3。

int mid = (min+max)/2;                                //找到中间值的位置

if(num==a[mid]) {                                      //方法3中的情况(1)

return mid;

}

if(num>a[mid]) {                                        //方法3中的情况(2)

min=mid+1;

}

if(num<a[mid]) {                                        //方法3中的情况(3)

max=mid-1;

}

}

return -1;                                                  //方法3中的情况都不满足,返回-1。

}


0条评论

点击登录参与评论