面试中经常会问一些查找算法,今天来总结一下常用的查找算法

一、顺序查找

描述:从表中的第一个或者是最后一个记录开始,将表中记录的关键字和给定的值进行逐个比较,若某个记录的关键字和给定值相             等,则查找成功,若表中所记录的关键字和给定值都不相等,则查找失败。

算法实现:

/**
     * 顺序查找
     *
     * @param searchKey 要查找的值
     * @param array     数组(从这个数组中查找)
     * @return 查找结果(数组的下标位置)
     */
    public static int orderSearch(int searchKey, int[] array) {
        if (array == null || array.length < 1)
            return -1;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == searchKey) {
                return i;
            }
        }
        return -1;
    }

二、二分查找

描述:折半查找的前提条件是在一个有序的序列汇总,首先确定待查询记录所在的区间,然后逐步的缩小范围区间直到找到或者找             不到该记录为止,与数学中的二分法一样。

算法实现:

/**
     * 二分查找(折半查找),它是一种效率较高的查找方法
     * 二分查找要求:1.必须采用顺序存储结构
     * 2.必须按关键字大小有序排列
     *
     * @param array     有序数组 *
     * @param searchKey 查找元素 *
     * @return searchKey的数组下标,没找到返回-1
     */
    public static int binarySearch(int[] array, int searchKey) {

        int low = 0;
        int high = array.length - 1;
        while (low <= high) {
            int middle = (low + high) / 2;
            if (searchKey == array[middle]) {
                return middle;
            } else if (searchKey < array[middle]) {
                high = middle - 1;
            } else {
                low = middle + 1;
            }
        }
        return -1;
    }

三、分块查找

描述:

1)首先将查找分成若干块,在每一块中数据元素的存放是任意的,但块与块之间必须是有序的(假设这种排序是按关键字值递增的,也就是说在第一块中任意一个数据元素关键字都小于第二块中所有数据元素的关键字,第二块中任意一个数据元素的关键字都小于第三块中所有元素的关键字,依次轮推)

2)建立一个索引表,把每块中最大的关键字值按块的顺序放在一个辅助数组中,这个索引表也按升序排列。

3)查找时先用给定的关键字值在索引表中查找,确定满足条件的数据元素存放在那个块中,查找方法既可以是折半也可以是顺序查找

4)再到相应的块中顺序查找,便可以得到查询结果

算法实现:

/**
     * 分块查找
     *
     * @param index 索引表,其中放的是各块的最大值
     * @param st    顺序表,
     * @param key   要查找的值
     * @param m     顺序表中各块的长度相等,为m
     * @return
     */
    public static int blockSearch(int[] index, int[] st, int key, int m) {
        // 在序列st数组中,用分块查找方法查找关键字为key的记录
        // 1.在index[ ] 中折半查找,确定要查找的key属于哪个块中
        int i = binarySearch(index, key);
        if (i >= 0) {
            int j = i > 0 ? i * m : i;
            int len = (i + 1) * m;
            // 在确定的块中用顺序查找方法查找key
            for (int k = j; k < len; k++) {
                if (key == st[k]) {
                    System.out.println("查询成功");
                    return k;
                }
            }
        }
        System.out.println("查找失败");
        return -1;
    }