一、描述
解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序。
Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m)
二、源代码
<span style="font-size:18px;">package tong.yue.sort;
import java.awt.RenderingHints.Key;
import java.util.Arrays;
/**
* JDK自带的二分查找算法和自己写的普通二分查找算法的比较
* @author Administrator
*
*/
public class BinarySearch {
public static void main(String[] args) {
//调用randomIntegerArray()方法,随机生成25个数字的数组
int[] valueResult = randomIntegerArray(25);
//调用Arrays类的sort()静态方法,对以上数组进行排序(二分查找只能针对已经排序的数组才能提高搜索效率)
Arrays.sort(valueResult);
System.out.print("排序后的结果为:");
printArrayLine(valueResult);
//例如我要查找20这个数的位置
int key = 20;
//调用普通二分查找算法
int index = binarySearch(valueResult,key);
System.out.println("普通二分查找算法结果:"+key+"在数组中的下标为:"+index);
//调用JDK自带的二分查找算法
index = binarySearchJDK(valueResult,key);
System.out.println("JDK自带的二分查找算法结果:"+key+"在数组中的下标为:"+index);
}
/*
*以下方法负责生成n个随机数的数组,并且随机数的范围为0-49
*/
public static int[] randomIntegerArray(int n) //返回由n个随机数组成的整数对象数组
{
int[] value = new int[n];
for (int i=0; i<value.length; i++)
value[i]=new Integer((int)(Math.random()*50));//产生一个0-49的随机数
return value; //返回数组引用
}
/**
* 普通的二分查找方法,查找到关键字则返回关键字所在的数组下标位置,找不到该关键字就返回-1
*/
public static int binarySearch(int[] arr,int value) {
// 二分查找
int min =0;
int max = arr.length-1;
int mid = (min+max)/2;
while(arr[mid]!=value){
if(arr[mid]>value){
max = mid-1;
}else if(arr[mid]<value){
min = mid+1;
}
if(min>max){
return -1;
}
mid = (max+min)/2;
}
return mid;
}
/*
* JDK自带的的二分查找方法,查找到关键字则返回关键字所在的数组下标位置,找不到该关键字就返回一个与最后查找位置相关的负数
*/
public static int binarySearchJDK(int[] arr,int value) {
// jdk本身自带的二分查找
int min =0;
int max = arr.length-1;
while(min<=max){
//采用无符号右移一位,即可以表示除以2
int mid = (min+max)>>>1;
int midValue = arr[mid];
if(midValue>value){
max = mid-1;
}else if(arr[mid]<value){
min = mid+1;
}else{
return mid;
}
}
//没有找到就返回一个与最终位置有关的负数
return -(min+1);
}
private static void printArrayLine(int[] arr) {
// 循环打印数组中的值,没打印10个数就换行
for (int i = 0; i < arr.length; i++) {
if (i%10==0) {
System.out.println();
}
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
</span>
三、运行结果