二分查找
查找前提:有序序列
每次寻找时,折半,将目标值与本次中间值进行对比,如果大于中间值就在其后面找,如果小于中间值就在其前面找(即缩小队列长度),然后再次折半找,缩小目标值所在区间范围,直到最终的中间值序列的值等于目标值(即找到目标所在位置)。
二分查找方式:(想法与快排类似)
//1.定义最小索引、最大索引
//2.计算中间索引
//3.拿查找的值和中间索引的值进行对比
//三种情况:1.相等,直接返回 2.中间值更大,往左找 3.中间值更小,往又找
//继续循环上面的2和3,直到最终找出目标值
写方法的两个要点:
1.是否有返回值,方法类型(返回值类型)
2.参数列表里的参数类型
案例代码如下
public class BinarySearch {
public static void main(String[] args) {
int[]arr ={1,5,6,7,8,9,10};
System.out.println(binarySearch(arr, 6));
}
public static int binarySearch(int[] arr,int value){
int max=arr.length-1,min=0;
int mid=(max+min)/2;
while(value !=arr[mid]){
//判断value在前还是在后
//当在中间值前面
if (value<arr[mid]){
max=mid-1;
mid=(max+min)/2;
}
//当在中间值后面
else if (value>arr[mid]){
min=mid+1;
mid=(max+min)/2;
}
else //如果前面两个都不符合,而且value不等于中间值,说明找不到
return -1;
}
return mid;
}
}
二分查找小练习:(用到了随机生成数方法random)
数组中,存放了10位同学的平均成绩,其中张三的成绩是84分,其他人的平均成绩在70-100之间随机生成
求:生成成绩后,张三的成绩在班级中的排名是多少
案例代码如下
public class Demo01 {
public static void main(String[] args) {
/*
数组中,存放了10位同学的平均成绩,其中张三的成绩是84分,
其他人的平均成绩在70-100之间随机生成
求:生成成绩后,张三的成绩在班级中的排名是多少
*/
//随机生成数组数据
int[] arr = new int[10];
arr[0] = 84;
//创建随机数对象random
Random random = new Random();
for (int i = 1; i < arr.length; i++) {
arr[i] = random.nextInt(30) + 70;
}
System.out.println("所有学生的平均成绩:");
BubbleSort.printArray(arr);
//数组排序
BubbleSort.bubbleSort(arr);
//数组查找
int index = BinarySearch.getIndex(arr, 84);
int paiming = arr.length - index;
System.out.println("张三的排名是:" + paiming);
}
}
Arrays工具类
在日常开发过程中,会根据用户的各种需求来定义不同类型的数组,我们可以调用之前编写的各种数组方面的方法,但是会出现现有方法的类型跟需求不匹配的问题。因而需要重新修改代码,非常麻烦。
jdk提供给我们使用的一个工具类,工具类中一般都封装了 很多的方法,可以给我们使用
关于工具类中各种现有方法的使用案例如下
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {10,33,4,21,35,6};
//toString()方法, 将数组以字符串形式输出
System.out.println(Arrays.toString(arr));
Arrays.sort(arr); //调用排序方法
System.out.println(Arrays.toString(arr));
int i = Arrays.binarySearch(arr, 33); //搜索
System.out.println(i);
//复制数组
int[] arr01 = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(arr01));
char[] charArray = {'a','c','b','x','f'};
Arrays.sort(charArray);
System.out.println(Arrays.toString(charArray));
}
}
利用工具类中现成的方法,可以大大加快开发效率(前提是要使用正确类型的方法,同时涉及到工具类的导入问题)关于一个工具类中往往包含多个同名的方法(方法类型不同),涉及到方法的重载,这在后面的学习过程中将会得到解释。
PS:多个同名的方法(方法重载)