美文网首页
《算法4第一章》笔记(一)二分查找(1)

《算法4第一章》笔记(一)二分查找(1)

作者: 烤地瓜次不次 | 来源:发表于2019-02-26 10:49 被阅读0次

问题说明:

从一组有序整形数组中找出指定的数。

源码:

package edu.princeton.cs.algs4;

import java.util.Arrays;

public class BinarySearch {

    private BinarySearch() {
    }

    public static int indexOf(int[] a, int key) {
        int lo = 0;
        int hi = a.length - 1;

        while(lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            if (key < a[mid]) {
                hi = mid - 1;
            } else {
                if (key <= a[mid]) {
                    return mid;
                }

                lo = mid + 1;
            }
        }

        return -1;
    }

    /** @deprecated */
    @Deprecated
    public static int rank(int key, int[] a) {
        return indexOf(a, key);
    }

    public static void main(String[] args) {
        In in = new In(args[0]);
        int[] whitelist = in.readAllInts();
        Arrays.sort(whitelist);

        while(!StdIn.isEmpty()) {
            int key = StdIn.readInt();
            if (indexOf(whitelist, key) == -1) {
                StdOut.println(key);
            }
        }

    }
}

程序输入取自tinyT.text文件,内容为

23
50
10
99
18
23
98
84
11
10
48
77
13
54
98
77
77
68

程序入口

public static void main(String[] args) {
    In in = new In(args[0]);
    int[] whitelist = in.readAllInts();
    // 二分查找法的前提条件是数组有序,所以先对数据进行排序
    Arrays.sort(whitelist);

    while(!StdIn.isEmpty()) {
        int key = StdIn.readInt();
        // 从console输入一个数字,使用indexOf方法判断是否存在,存在就打印出来
        if (indexOf(whitelist, key) == -1) {
            StdOut.println(key);
        }
    }

}

算法逻辑分析

public static int indexOf(int[] a, int key) {
    int lo = 0;// 区间最小值的索引
    int hi = a.length - 1;// 区间最大值的索引

    while(lo <= hi) {
        int mid = lo + (hi - lo) / 2;// 1.取出区间中间的索引
        // 2.如果中间的数大于key,则hi所有右边的数,全部大于key,舍弃
        if (key < a[mid]) {
            hi = mid - 1;
        } else {
            // 3.只有当相等时,即为找到了
            if (key <= a[mid]) {
                return mid;
            }
            // 4.反之,如果中间的数小于key,则lo所有左边的数,全部小于key,舍弃
            lo = mid + 1;
        }
    }
    // 全部循环发现找不到,返回-1
    return -1;
}

相关文章

网友评论

      本文标题:《算法4第一章》笔记(一)二分查找(1)

      本文链接:https://www.haomeiwen.com/subject/jraoyqtx.html