数组的查找(线性、二分法)

常用的数组查找方法
【发电站】---------电线杆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])
	}
}

posted @ 2022-03-10 10:13  形码客  阅读(234)  评论(0)    收藏  举报