二分法是用来查找一个有序数组且不重复里的数据的方法,它的原理是:
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条评论
点击登录参与评论