二分查找
前提:可以使用二分搜索的前提是该数组是一个有序的数组。
(若不是有序数组,可使用Array.sort(arr)方法进行排序)
一,分析二分搜索的过程
二,代码实现
import java.util.*;
public class HW3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); //输入要查找的数
System.out.println("请输入要打印的数据:");
int number = in.nextInt();
Random rd = new Random(); //在数组中随机,注:范围是在打印时标示
int[] arr = new int[11];
for (int i = 0; i < 11; i++) //对数组的11个数,开始分配值
{
arr[i] = rd.nextInt(50); //0-49 //对这11个数组赋值
}
Arrays.sort(arr); // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序
System.out.println(Arrays.toString(arr)); //将有序数组打印出来
int index = Search(arr, number); //调用search()方法(二分搜索)进行查找
if(index==-1){ //若返回的是-1,则没有找到数
System.out.println("没有查找到该数!!!");
}else{ //若返回为下标,则表示找到了该数
System.out.println("查找的数下标为:"+index);
}
}
private static int Search(int[] arr, int number) { //将所要遍历的数组和所要查找的数值赋给该方法
int start = 0; //先定义三个变量,用来缩减范围
int end = arr.length - 1;
int middle = 0;
while (end >= start) { //end>=start,说明数组还没有查完,则继续查找
middle = (start + end) / 2;
if (number < arr[middle]) {
end = middle - 1;
} else if (number > arr[middle]) {
start = middle + 1;
} else {
return middle; //当找到该数,则返回下标
}
}
return -1; //若end>start,表明数组已遍历完也没有找到所要找到数,此时返回-1;
}
}
三,运行结果:
以上是二分查找的代码实现,其实在Java中已经有可以直接调用的二分查找函数,使用方法具体如下:
1 import java.util.*; 2 public class HW3 { 3 public static void main(String[] args) { 4 Scanner in = new Scanner(System.in); //输入要查找的数 5 System.out.println("请输入要打印的数据:"); 6 int number = in.nextInt(); 7 Random rd = new Random(); //在数组中随机,注:范围是在打印时标示 8 int[] arr = new int[11]; 9 for (int i = 0; i < 11; i++) //对数组的11个数,开始分配值 10 { 11 arr[i] = rd.nextInt(50); //0-49 //对这11个数组赋值 12 } 13 Arrays.sort(arr); // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序 14 System.out.println(Arrays.toString(arr)); //打印排好序的数组 15 int index = Arrays.binarySearch(arr, number); //调用binarysearch()方法(二分搜索)进行查找 16 if(index<-1){ //若返回的数小于-1,则没有找到数 17 System.out.println("没有查找到该数!!!"); 18 }else{ //若返回为下标,则表示找到了该数 19 System.out.println("查找的数下标为:"+index); 20 } 21 } 22 23 }
Arrays.binarySearch(arr,number)方法的底层代码:
(注意与上述代码不同的是,调用此方法查找数值,若没有找到则返回的是负数,--(insertion point)--1)
Arrays.binarySearch(arr , formindex, endindex, number)方法的底层代码:
四,时间复杂度分析
当我们进行二分搜索的时候,其搜索过程类似于遍历一个二叉树。
(左边是小于arr[middle]的情况,右边是大于arr[middle]的情况)
由图可知,二分搜索的时间复杂度是线性时间,随着层数n的值越来越大,所要遍历的
数n越来越多,因此花费的时间也越来越多。(因为j越大,花费的时间就越多,所以此处
可将j看作时间对待)