算法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

猜你喜欢

转载自blog.csdn.net/lucky_tom/article/details/126022239
今日推荐