使用二分法查找的前提是:被查找的数组已排好序。
我们先用随机数生成一个数组,然后给数组排序。
Random rand = new Random();
int[] arr = new int[30];
//给数组内的元素随机赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = rand.nextInt(100);
}
//用Arrays类排序
Arrays.sort(arr);
//遍历数组
for (int i : arr) {
System.out.print(i+"\t");
}
//换行
System.out.println();
思路:定义起始位start(数组第一个元素)和末位end(数组最后一个元素),中间位置mid=(start+end)/2,把待查找元素与中间位置的元素进行比较,如果待查找元素比中间位置对应的值小,那么end = mid -1,如果待查找元素比中间位置对应的值大,那么start = mid + 1,如果找到了对应的值,就break跳出循环,否则一直循环查找,直到start > end,证明没找到对应的值,停止循环。
代码如下:
//随机生成一个数,在数组中用二分法查找它
int v = rand.nextInt(100);
//count统计查找次数
//index为假设下标
int begin=0,end=arr.length-1,mid,count=0,index=-1;
while (begin<=end){
mid = begin + (end-begin)/2; //或者mid = (begin+end)/2;
if (v>arr[mid]){
begin = mid+1;
count++;
}else if(v<arr[mid]){
end = mid-1;
count++;
}else {
//存放该值在数组中的下标
index = mid;
count++;
break;
}
}
完整代码如下:
import java.util.Arrays;
import java.util.Random;
public class BinarySearch {
public static void main(String[] args) {
Random rand = new Random();
int[] arr = new int[30];
for (int i = 0; i < arr.length; i++) {
arr[i] = rand.nextInt(100);
}
Arrays.sort(arr);
for (int i : arr) {
System.out.print(i+"\t");
}
System.out.println();
int v = rand.nextInt(100);
int begin=0,end=arr.length-1,mid,count=0,index=-1;
while (begin<=end){
mid = begin + (end-begin)/2;
if (v>arr[mid]){
begin = mid+1;
count++;
}else if(v<arr[mid]){
end = mid-1;
count++;
}else {
index = mid;
count++;
break;
}
}
System.out.println("一共查找了"+count+"次");
System.out.println(v+(index!=-1 ? "存在于数组中下标为"+index:"不存在于数组中"));
}
}
控制台输出结果为: