数组的查找(线性、二分法)
常用的数组查找方法
【发电站】---------电线杆1----电线杆2---x--灯泡
现在灯泡不亮了,
一是正常从发电站到灯泡或者反过来。依次测电线是否有电。这种就叫顺序查找也叫线性查找。
二是从电线杆1到电线杆2之间测是否有电,有电说明发电站到电线杆2都是没问题的,那再测电线杆2到灯泡,发现断电。这种就叫二分法。
代码
public class LinearSearch {
public static void main(String[] args) {
// 线性查找,逐个匹配。用循环判断每个数组元素是否与输入变量相等。
// 在输出时,用boolean型变量重新赋值,来判断输出内容。
String[] arry = {"AA","BB","CC"};
String dest = "BB";
boolean isFlag = true;
for (int i=0;i<arry.length;i++){
if (dest.equals(arry[i])){
System.out.println("成功找到"+i);
isFlag = false;
break;
}
}
if (isFlag){
System.out.println("没找到");
}
System.out.println("二分法");
// 二分法(顺序数组),二分法查询数组首先是顺序数组,即数组元素按顺序排列(从小到大、从大到小)
int[] arry1 = {-2,-1,3,5,34,56,75,80};
int dest1 = -1;
int head = 0;//首个数组位
int end = arry1.length - 1;//数组长度减1,即最后一个数组位。理解为首个数组位为0,1到n是n个数,而数组长度n是从0到n-1.0到n-1就是数组的标识位
boolean isFlag1 = true;
// 1 2 3 4 5 | 6 7 8 9 10
// 1 2 3 4 5 | 6 7 8 9 10 11
while (head <= end){
// 用int型获取数组中间位,即结果为5.5,middle=5
int middle = (head + end)/2;
//
if (dest1 == arry1[middle]){
System.out.println("找到了数组标志位是"+middle);
isFlag1 = false;
break;
}else if(dest1 < arry1[middle]){
// 如果我们查到的二分法中间位的数组元素大于要查找的变量
// 说明中间位需要再小,以从小到大排序,往左的数组位元素越小。
// 对数组末位重新赋值,首位不变,缩小范围到左半部分。
// 那么把当前的中间位看做新的数组末位,首位不变。
// 那么往左就是当前末位下标减去1。
// 查 1
// - +
// 1 2 3 |4| 5 6 7 中间标志位3 = (0+6)/2
// - + end = middle -1 = 3 -1 =2
// 1 |2| 3 中间标志位1 = (0+2)/2
// - + end = middle -1 = 1 -1 =0
// |1| 中间标志位0 = (0+0)/2
end = middle - 1;
}else{
// 反之原理一样
head = middle -1;
}
}
if (isFlag1){
System.out.println("没找到");
}
// 二分法拓展:当从大到小排序数组首末位重新赋值如何变化
// 二分法拓展:差值法--(查找的变量 - arry[0])/(arry[arry.length - 1] -arry[0])
}
}

浙公网安备 33010602011771号