欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

查找算法之线性查找和二分查找

程序员文章站 2022-07-12 11:28:49
...

查找算法即在数据中查找自己指定的值,我们这里是返回对应的下标。
1.线性查找(顺序查找)
很简单:
代码实现:

package chazhao;
import java.util.ArrayList;
import java.util.List;

public class LineChazhao {

    public static void main(String[] args) {
        int[] arr = {2, 5, 4, 6, 5, 4, 6, 4, 9, 6, 4};
        List<Integer> integers = lineChazhao(arr, 40);
        System.out.println(integers.toString());
    }


    public static List<Integer> lineChazhao(int[] arr, int num) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                list.add(i);
            }
        }
        if (list.size() == 0) {
            list.add(-1);
        }
        return list;
    }
}

结果:
查找算法之线性查找和二分查找

2.二分查找(折半查找,前提是必须有序,排序算法在前面的文章)
代码实现(这里用的是递归):

package chazhao;
import java.util.ArrayList;
import java.util.List;

public class BinarySerch {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9};
        List<Integer> i = binarySerach(arr, 0, arr.length - 1, 8);
        System.out.println(i.toString());
    }

    public static List<Integer> binarySerach(int[] arr, int left, int right, int num) {
        if (arr == null) {
            throw new NullPointerException("目标数组为空!");
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];

        List<Integer> list = new ArrayList<>();
        if (left <= right) {
            if (num > midVal) {

                return binarySerach(arr, mid + 1, right, num);
            }
            if (num < midVal) {
                return binarySerach(arr, left, mid - 1, num);
            }
            if (num == midVal) {
                //左
                int temp = mid - 1;
                while (true) {
                    //循环左边所有的元素,只要发现一个不等于当前找的数字就退出
                    if (temp < 0 || arr[temp] != num) {
                        break;
                    }
                    //退出了说明找到了,如果没找到直接break跳出while
                    list.add(temp);
                    temp--;
                }
                //中间的本来就是
                list.add(mid);
                //右边的
                temp = mid + 1;
                while (true) {
                    //循环左边所有的元素,只要发现一个不等于当前找的数字就退出
                    if (temp > arr.length - 1 || arr[temp] != num) {
                        break;
                    }
                    //退出了说明找到了
                    list.add(temp);
                    temp++;
                }

            }

        }
        return list;
    }
}

结果:

查找算法之线性查找和二分查找

相关标签: 算法