算法4 - 二分查找

二分法查找

题目:预制一个白名单列表tinyW.txt,输入tinyT.txt,打印不在白名单中的元素。

1,迭代

    public static int rank(int key,int[] a){
    	//
        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]) lo = mid+1;
            else return mid;
        }
        return -1;
    }

2,递归

    /*递归*/
    public static int rank(int key,int[]a,int lo,int hi){
        //递归注意结束条件
        if (lo>hi) return -1;
        //左半部分起点lo为0并且永远不会减小,右半部分注意起点。
        int mid = lo+(hi-lo)/2;
        if (key<a[mid]) return rank(key,a,lo,mid-1);
        else if (key>a[mid]) return rank(key,a,mid+1,hi);
        else return mid;
    }

完整代码

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

import java.util.Arrays;

/**
 * 算法4 - 二分法查找
 */
public class BinarySearch {


    /*迭代*/
    public static int rank(int key,int[] a){
        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]) lo = mid+1;
            else return mid;
        }
        return -1;
    }

    /*递归*/
    public static int rank(int key,int[]a,int lo,int hi){
        //
        if (lo>hi) return -1;
        int mid = lo+(hi-lo)/2;
        if (key<a[mid]) return rank(key,a,lo,mid-1);
        else if (key>a[mid]) return rank(key,a,mid+1,hi);
        else return mid;
    }


    public static void main(String[] args) {

        int[] whiteList = In.readInts(args[0]);
        //二分法查找前提是有序
        Arrays.sort(whiteList);
        //
        while(!StdIn.isEmpty()){
            int key = StdIn.readInt();
//            if (rank(key,whiteList)<0){
//                StdOut.println(key);
//            }
            if (rank(key,whiteList,0,whiteList.length-1)<0){
                StdOut.println(key);
            }
        }
    }

tinyT.txt 输入数据源

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

tinyW.txt 预制白名单

84
48
68
10
18
98
12
23
54
57
33
16
77
11
29

输入输出,使用了《算法4》提供的jalgs4.jar,ide环境没配好,使用java命令执行,注意linux使用冒号,Window用分号

javac -cp .:../../../libs/algs4.jar BinarySearch.java
java -cp .:../../../libs/algs4.jar BinarySearch tinyW.txt  < tinyT.txt

结果:

50
99
13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值