一、二分法查找元素
二分法查找元素的方式又叫折半查找,从数组中查找,而且数组是已经按照升序或者降序排列好的,如果数组的元素是无序的则不能使用二分法查找。
【我们有一个数组,这个数组有100万个元素,此时我们有一个需求:
得到了一个数据,我们要判断这个数组是否有这个数据,如果有则返回对应的下标索引,如果没有就返回-1,要实现这个需求有两种方案可选,一种是线性查找,一种就是二分法查找】
线性查找
public class Test {
public static void main(String[] args) {
long [] arr = new long[100000000];
//为数组的元素赋值
for (int i = 0; i < arr.length; i++) {
arr[i]=i*10;
}
//判断1000000000是否在数组中
//取得执行方法之前的时间点
long start=System.currentTimeMillis();
System.out.println(search(arr,1000000000));
//取得执行方法完毕的时间点
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
/**
* 查找指定的值在数组中的索引下标(线性查找方式)
* @param arr 目标数组
* @param key 需要查找的值
* @return
*/
public static long search(long [] arr,long key) {
for (int i = 0; i < arr.length; i++) {
if (key==arr[i]) {
return i;
}
}
return -1;
}
}
-1
耗时:64
二分法查找
public class Test {
public static void main(String[] args) {
long [] arr = new long[100000000];
//为数组的元素赋值
for (int i = 0; i < arr.length; i++) {
arr[i]=i*10;
}
//判断1000000000是否在数组中
//取得执行方法之前的时间点
long start=System.currentTimeMillis();
System.out.println(binarySearch(arr,1000000000));
//取得执行方法完毕的时间点
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
/**
* 查找指定的值在数组中的索引下标(线性查找方式)
* @param arr 目标数组
* @param key 需要查找的值
* @return
*/
public static long search(long [] arr,long key) {
for (int i = 0; i < arr.length; i++) {
if (key==arr[i]) {
return i;
}
}
return -1;
}
/**
* 使用二分法查找数据
* @param arr 数组
* @param key 要查找的数据
* @return 如果有则返回对应数据在数组中下标 否则返回-1
*/
public static int binarySearch(long [] arr ,long key) {
//数组的第一个元素的下标
int left=0;
//数组最后一个元素的下标
int right =arr.length-1;
//保存中间下标的变量
int mid;
//{8,9,10,23,45,67,98}
while(left<=right) {
mid=(left+right)/2;
if (key==arr[mid]) {
return mid;
}else if (key>arr[mid]) {
left=mid+1;
}else {
right=mid-1;
}
}
return -1;
}
}
-1
耗时:0