二分查找法

来源:互联网 发布:windows 3.51 编辑:程序博客网 时间:2024/04/28 13:18

我们知道,如果我们在一个数组中查找 一个指定数据位置的话,大部分人的想法是,这不很简单么,for循环数组,然后找出来就好了 好比这样,

    public static int binarySearch(int key, int i[]) {        for (int q = 0; q < i.length; q++) {            if (i[q] == key) return q;        }        return -1;    }    public static void main(String args[]) {        int[] a = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};      System.out.println(FindData.binarySearch(4,a));    }

这样写确实没问题,但是如果数据量是 100w 甚至1000w或者更高的时候,那么它的效率就不是很好了,这时我们就应该用二分查找来解决。

注意二分查找法只能查找有序数组

public class BinarySearch {    public static int binarySearch(int key, int[] source) {        int left = 0; //最左边        int right = source.length - 1;//最右边        while (left <= right) { //left会越来越大, right会越来越小            int mid = left + (right - left) / 2;            if (source[mid] < key) left = mid + 1;            else if (source[mid] > key) right = mid - 1;            else return mid;        }        return -1;    }    public static void main(String argsp[]) {        int[] source = new int[]{1, 2, 3, 4, 5, 6, 7};        System.out.println(BinarySearch.binarySearch(7, source));    }}

二分查找法的思路是,在一个有序的数组内,先记录起始点 和终止点 查找出数组中间索引点,然后把数组内中间点的值取出来和传入要查找的值进行比对, 如果要查找的值比中间点大的话,那么把起始点移动到 中间点+1,在右边的数组块内查找,反之相同。
这样做的话 每次只查找源数组内的一半数组,效率得到提升。
有序数组查找