前言: 实现了二分查找算法、遍历查找法。另外,加入List工具类进行运算时间的对比。
package com.xiucai;
import com.google.common.collect.Lists;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/**
* @author xiucai
* @date 2022/1/25 7:35 下午
* @description 二分查找算法
*/
public class ProgramTest {
public static void main(String[] args) {
//要查找到数
Scanner scan = new Scanner(System.in);
System.out.print("请输入您要查找的数字: ");
int goal = scan.nextInt();
//获得从小到大排列的随机数组
List<Integer> randomList = getSortedRandomList();
//------------------------------------------------------------------------------------------
//获取开始时间
long startTime1 = System.nanoTime();
//使用二分法
useDichotomy(goal, randomList);
//获取结束时间
long endTime1 = System.nanoTime();
System.out.println("用二分法的查找时间为: " + (endTime1 - startTime1) + "ns");
//------------------------------------------------------------------------------------------
//获取开始时间
long startTime2 = System.nanoTime();
//用笨方法查
useTraditional(goal, randomList);
//获取结束时间
long endTime2 = System.nanoTime();
System.out.println("用笨方法的查找时间为: " + (endTime2 - startTime2) + "ns");
//------------------------------------------------------------------------------------------
//获取开始时间
long startTime3 = System.nanoTime();
//用工具类查
useTool(goal, randomList);
//获取结束时间
long endTime3 = System.nanoTime();
System.out.println("用工具类的查找时间为: " + (endTime3 - startTime3) + "ns");
}
/**
* 用工具类查数字
*
* @param goal 需要查找的那个数字
* @param randomList 随机的数组
*/
private static void useTool(int goal, List<Integer> randomList) {
boolean isContain = randomList.contains(goal);
if (isContain) {
System.out.println("用工具类, 您的值找到了");
} else {
System.out.println("用工具类, 您的值找不到");
}
}
/**
* 用笨方法查需要查找的那个数字
*
* @param goal 需要查找的那个数字
* @param randomList 随机的数组
*/
private static void useTraditional(int goal, List<Integer> randomList) {
//获得从小到大排列的随机数组
boolean findFlag = false;
for (Integer num : randomList) {
if (num == goal) {
findFlag = true;
break;
}
}
if (findFlag) {
System.out.println("用笨方法, 您的值找到了");
} else {
System.out.println("用笨方法, 您的值找不到");
}
}
/**
* 使用二分法查找结果
*/
private static void useDichotomy(int goal, List<Integer> randomList) {
//最小值的下标,默认是数组的第一个
int min = 0;
//最大值的小标
int max = randomList.size() - 1;
//计算的中值
int mid = 0;
while (true) {
//每次进入循环的时候,都会重新计算mid值
mid = (min + max) / 2;
//最大,最小,中值
List<Integer> needCompareList = Lists.newArrayList();
needCompareList.add(randomList.get(min));
needCompareList.add(randomList.get(max));
needCompareList.add(randomList.get(mid));
//找到了对应的目标数
if (needCompareList.contains(goal)) {
System.out.println("用二分法, 您的值找到了");
break;
}
//判断目标值计算得到的中位值的关系
if (goal > randomList.get(mid)) {
min = mid + 1;
} else {
max = mid - 1;
}
//最大的下标都比0小,最大的下标比最小的下标还要小
if (max < 0 || max <= min) {
System.out.println("用二分法, 您的值找不到");
break;
}
}
}
/**
* 获得随机的的从小到大排列的数组
*/
private static List<Integer> getSortedRandomList() {
List<Integer> randomList = Lists.newArrayList();
for (int i = 1; i <= 100000; i++) {
Random random = new Random();
int randomNumber = 1 + random.nextInt(10000000);
randomList.add(randomNumber);
}
//从小到大配列顺序
Collections.sort(randomList);
return randomList;
}
}