算法_线性查找与二分法查找

时间:2021-12-03 22:10:10
package com.demo;

/*
 * 1.线性查找
 *   在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。
 *   线性查找又称为顺序查找。
 * 2.二分法查找
 *   二分法查找适用于数据量较大时,但是数据需要先排好顺序。
 */

public class ArrayTest {
	public static void main(String[] args) {
		// 1.线性查找
		// 字符串数组
		String[] arrStr = new String[] { "AA", "BB", "CC", "DD", "EE" };
		// 遍历数组
		for (int i = 0; i < arrStr.length; i++) {
			System.out.print(arrStr[i] + " ");
		}
		System.out.println();

		String objStr = "BB"; // 目标字符串
		boolean flag = true; // 标识
		// 找到了指定元素
		for (int i = 0; i < arrStr.length; i++) {
			if (objStr.equals(arrStr[i])) {
				System.out.println("找到了指定元素,位置为:" + i);
				flag = false;
				break;
			}
		}
		// 没找到指定元素
		if (flag) {
			System.out.println("没找到指定元素");
		}
		System.out.println();

		
		
		// 2.二分法查找 (前提:所查找的数是有序的)
		// 整型数组
		int[] arrNum = new int[] { 12, 24, 36, 48, 56, 76, 88, 94 };
		// 遍历数组
		for (int i = 0; i < arrNum.length; i++) {
			System.out.print(arrNum[i] + " ");
		}
		System.out.println();
		
		int objNum = 48; // 所要查找的数字
		int head = 0; // 头索引
		int end = arrNum.length - 1; // 尾索引
		boolean flag1 = true; // 标识
		while (head <= end) {
			int mid = (head + end) / 2; // 中间位置索引
			if (objNum == arrNum[mid]) { // 找到了
				System.out.println("找到了指定元素,位置为:" + mid);
				flag1 = false; // 如果找到了元素,则改变flag1
				break;
			} else if (objNum < arrNum[mid]) {
				end = mid - 1;
			} else { // objNum > arrNum[mid]
				head = mid + 1;
			}
		}
		// 没找到(flag1没有改变)
		if (flag1) {
			System.out.println("没找到指定元素");
		}
		

	}
}