折半查找与哈希查找

结城 Java 13 次阅读 678 字 发布于 2026-05-04 预计阅读时间: 3 分钟


折半查找,二分查找,本质上是一种方法的两种叫法,都是对一个有序数组进行查找排序的方法

折半查找不能确定数据在原数组中的位置,只能确定数据在原数组中,查找到数据在排序后的位置

哈希查找,使用Map统计设计数据在原数组中的位置

图记录的数据是,数据的内容作为Key,数据的位置作为Value

public class ChickNum {
    // 使用折半查找查找排序后的某个元素
    // 折半查找,二分查找,本质上是一种方法的两种叫法,都是对一个有序数组进行查找排序的方法
    // 折半查找不能确定数据在原数组中的位置,只能确定数据在原数组中,查找到数据在排序后的位置
    private static int chickNum(int[] nums, int target){
        System.out.println("数组未排序,排序前的序列为:");
        System.out.println(Arrays.toString(nums));

        sort(nums);

        int left = 0;
        int right = nums.length - 1;

        while (left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                return mid;
            }else {
                if (target < nums[mid]){
                    right = mid - 1;
                }else {
                    left = mid + 1;
                }
            }
        }

        return -1;
    }

    // 使用map查找原数组位置
    private static int chickNumForMap(int[] nums, int target){
        Map<Integer, Integer> map = toMap(nums);
        if (map.containsKey(target)){
            return map.get(target);
        }
        return -1;
    }

    // 查找数据在原数组中的位置
    // 图记录的数据是,数据的内容作为Key,数据的位置作为Value
    private static Map<Integer, Integer> toMap(int[] nums){
        System.out.println("数组未排序,排序前的序列为:");
        System.out.println(Arrays.toString(nums));

        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++){
            map.put(nums[i], i);
        }
        System.out.println("原数据,图已完成记录:");
        System.out.println(map);
        return map;
    }

    private static void sort(int[] nums){
        Arrays.sort(nums);
        System.out.println("数组已排序,排序后的序列为:");
        System.out.println(Arrays.toString(nums));
    }

    public static void main(String[] args) {
        int[] nums = {1, 5, 2, 3, 4, 6, 666, 8, 9, 10};
        int target = 5;
        System.out.println("数据已找到,排序后的位置为:" + chickNum(nums, target));
        System.out.println();

        nums = new int[]{1, 5, 2, 3, 4, 6, 666, 8, 9, 10};
        System.out.println("数据已找到,原数据的位置为:" + chickNumForMap(nums, target));
    }
}

执行结果

数组未排序,排序前的序列为:
[1, 5, 2, 3, 4, 6, 666, 8, 9, 10]
数组已排序,排序后的序列为:
[1, 2, 3, 4, 5, 6, 8, 9, 10, 666]
数据已找到,排序后的位置为:4

数组未排序,排序前的序列为:
[1, 5, 2, 3, 4, 6, 666, 8, 9, 10]
原数据,图已完成记录:
{1=0, 2=2, 3=3, 4=4, 5=1, 6=5, 8=7, 9=8, 666=6, 10=9}
数据已找到,原数据的位置为:1
给时光以生命,给岁月以文明
最后更新于 2026-06-15