查找算法

30 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情

前言:之前的文章给大家讲解了排序算法的几种排序算法,给大家总结一下排序算法的优劣对比,接下来给大家介绍查找算法~

排序算法对比

image-20220904153537107

解释:

  1. 稳定:如果 a原本在 b前面,而a=b , 排序之后 a仍然在 b的前面;
  2. 不稳定:如果 a原本在 b的前面,而 a=b,排序之后 a可能会出现在 b的后 面;
  3. 内排序:所有排序操作都在内存中完 成;
  4. 外排序:由于数据太大,因此把数据 放在磁盘中,而排序通过磁盘和内存 的数据传输才能进行;
  5. 时间复杂度: 一个算法执行所耗费 的时间。
  6. 空间复杂度:运行完一个程序所需内 存的大小。
  7. n:数据规模
  8. k:“桶”的个数
  9. In -place:不占用额外内存
  10. Out -place:占用额外内存

查找算法

顺序(线性查找)查找

  • 从头到尾一个一个进行对比查找,找到则返回下标
/**
 * @author Kcs 2022/9/5
 */
public class SequenceSearch {
    public static void main(String[] args) {
        //数组
        int[] arr = {1 ,-25, 45, 32, 3, 0, 12, -20};
        int index = seqSearch(arr, 0);
        if (index == -1) {
            System.out.println("查无次数据");
        } else {
            System.out.println("该数字位于:" + index);
        }
    }
​
    /**
     * 找到一个就返回
     * @param arr 匹配数组
     * @param value 要查找的数
     * @return index
     */
    public static int seqSearch(int[] arr, int value) {
        //逐一比对
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == value) {
                return i;
            }
        }
        return -1;
    }
}

二分查找 / 折半查找

  • 必须是顺序的数组,若是无序的,则需要先排序(小到大 / 大到小)

思路

(以下是排序已为由小到大)

  1. 首先确定该数组的中间下标

    • mid = (left + right)/ 2
  2. 然后让需要查找的数 findValue 和 arr[mid] 进行比较

    1. findValue > mid[arr] :说明要查找的数在 mid 的右边,应该向右查找(向右递归查找)
    2. findValue < mid[arr] :说明要查找的数在 mid 的左边,应该向左查找(向左递归查找)
    3. findValue = mid[arr] :说明已经找到,则返回
  3. 退出递归

    1. 找到目标退出递归
    2. 找不到退出递归 (==left > right==)