0
点赞
收藏
分享

微信扫一扫

【Java】二分查找、遍历查找、工具类查找查找对比

前言: 实现了二分查找算法、遍历查找法。另外,加入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;
    }
}
举报

相关推荐

0 条评论