数据结构和算法——查找算法

目录

线性查找法

二分查找法

插值查找法

斐波那契查找法


线性查找法

可以是有序的,也可以是无序的。

public class SeqSearch {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 9, 11, -1, 34, 89};
        int res = seqSearch(arr, 34);
    }

    public static int seqSearch(int[] arr, int n) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == n) {
                return i;
            }
        }
        return -1;
    }
}

二分查找法

也叫折半查找,数组必须有序。

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = new int[]{2, 2, 4, 4, 5};
//        int res = binarySearch(arr, 6);
        List list = binarySearchPlus(arr, 6);
    }

    public static int binarySearch(int[] arr, int n) {
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (n < arr[m]) {
                r = m - 1;
            } else if (n > arr[m]) {
                l = m + 1;
            } else if (n == arr[m]) {
                return m;
            } else {
                return -1;
            }
        }
        return -1;
    }

    public static ArrayList binarySearchPlus(int[] arr, int n) {
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (n < arr[m]) {
                r = m - 1;
            } else if (n > arr[m]) {
                l = m + 1;
            } else if (n == arr[m]) {
                ArrayList list = new ArrayList<>();
                list.add(m);
                for (int i = m - 1; i >= 0 && n == arr[i]; i++) {
                    list.add(i);
                }
                for (int i = m + 1; i < arr.length && n == arr[i]; i++) {
                    list.add(i);
                }
                Collections.sort(list);
                return list;
            } else {
                return null;
            }
        }
        return null;
    }
}

插值查找法

二分查找:

mid=\frac{low+high}{2}=low+\frac{1}{2}(high-low)

插值查找:

mid=low+\frac{key-a[low]}{a[high]-a[low]}(high-low)

适用于数据连续的数组,

斐波那契查找法

你可能感兴趣的:(数据结构和算法,数据结构和算法)