爪哇国新游记之二十七----数组的二分查找

代码:

import java.util.ArrayList;
import java.util.List;

public class Bit {
    int max;
    int min;
    int[] arr;

    public Bit(int[] arrInput) {
        // 找出极值
        for (int i = 0; i < arrInput.length; i++) {
            if (max < arrInput[i]) {
                max = arrInput[i];
            }
            if (min > arrInput[i]) {
                min = arrInput[i];
            }
        }

        // 新建数组
        arr = new int[max - min + 1];

        // 数组插值
        for (int i : arrInput) {
            int index = i - min;
            arr[index]++;
        }
    }

    public boolean hasDuplicateItem() {
        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value > 1) {
                return true;
            }
        }

        return false;
    }

    public List<Integer> getSortedList() {
        List<Integer> ls = new ArrayList<Integer>();

        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value != 0) {
                for (int j = 0; j < value; j++) {
                    ls.add(min + i);
                }
            }
        }

        return ls;
    }

    public List<Integer> getUniqueSortedList() {
        List<Integer> ls = new ArrayList<Integer>();

        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value != 0) {
                ls.add(min + i);
            }
        }

        return ls;
    }

    public int[] getUniqueSortedArray(){
        List<Integer> ls=getUniqueSortedList();

        int[] arr=new int[ls.size()];

        for(int i=0;i<arr.length;i++){
            arr[i]=ls.get(i);
        }

        return arr;
    }

    /**
     * 二分查找
     *
     * @param sortedArray
     *            已排序的欲查找的数组
     * @param seachValue
     *            查找的值
     * @return 找到的元素下标,若找不到则返回-1
     */
    public static int binSearch(int[] sortedArray, int seachValue) {
        // 左边界
        int leftBound = 0;
        // 右边界
        int rightBound = sortedArray.length - 1;
        // 当前下标位置
        int curr;

        while (true) {
            // 定位在左边界和右边界中间
            curr = (leftBound + rightBound) / 2;

            if (sortedArray[curr] == seachValue) {
                // 找到值
                return curr;
            } else if (leftBound > rightBound) {
                // 左边界大于右边界,已经找不到值
                return -1;
            } else {
                if (sortedArray[curr] < seachValue) {
                    // 当当前下标对应的值小于查找的值时,缩短左边界
                    leftBound = curr + 1;
                } else {
                    // 当当前下标对应的值大于查找的值时,缩短右边界
                    rightBound = curr - 1;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = { -2, -1, 3, 5, 7, 9, 30, 4, -2, 5, 8, 3 };
        Bit b = new Bit(arr);

        System.out.println("排序后数组");
        int[] arr2=b.getUniqueSortedArray();
        for(int i=0;i<arr2.length;i++){
            System.out.println(i+":"+arr2[i]);
        }

        int[] arr3={2,5,7,-2,90};

        for(int i=0;i<arr3.length;i++){
            int index=Bit.binSearch(arr2, arr3[i]);
            if(index!=-1){
                System.out.println(arr3[i]+"排在数组arr2的第"+index+"个");
            }else{
                System.out.println(arr3[i]+"不在数组arr2中");
            }
        }
    }
}

输出:

排序后数组
0:-2
1:-1
2:3
3:4
4:5
5:7
6:8
7:9
8:30
2不在数组arr2中
5排在数组arr2的第4个
7排在数组arr2的第5个
-2排在数组arr2的第0个
90不在数组arr2中

爪哇国新游记之二十七----数组的二分查找

时间: 2024-11-11 23:33:54

爪哇国新游记之二十七----数组的二分查找的相关文章

爪哇国新游记之二十五----图及其遍历查找

代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; // 顶点类 class Vertex{ String name;// 名称 boolean visited;// 是否已访问

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.

爪哇国新游记之二十一----快算24

四张牌,通过四则运算得到24,一个数限用一次,快者为胜. 代码: import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 快算24 * @author heyang * */ public class Caculator{ private double anticipate;// 预期结果 private double op1;// 操作数一

爪哇国新游记之二十八----从url指定的地址下载一个文件到本地

package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.zip.GZIPInputStream; /** * 从url指定的地址下载一个文件到本地 * 2014

爪哇国新游记之二十四----二叉树

/** * 二叉树节点类 * */ class Node<T extends Comparable> { public Node(T data){ this.data=data; } T data; Node<T> left; Node<T> right; } /** * 二叉树类 */ public class BinaryTree<T extends Comparable> { /** * 根節點 */ private Node<T> roo

爪哇国新游记之二十----将数字转换成汉子大写形式

/** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; this.pos=pos; } } /** * 将数字转化成汉字大写形式 * */ public class CnNumMaker { private String integerPart;// 整数部分 private String decimalPart;// 小数部分 private Sta

爪哇国新游记之十五----泛型动态数组类

import java.lang.reflect.Array; /** * 泛型动态数组类 * */ public class DynamicArray<T extends Object>{ private T[] arr; private Class<T> type; private int currCount; private static final int InitSize=2; public DynamicArray(Class<T> type){ this.

爪哇国新游记之十二----线程创建的两种形式

public class Thread1 extends Thread{ public void run(){ int i=0; while(i<10){ i++; System.out.println(i); } } public static void main(String[] args){ Thread1 t=new Thread1(); t.start(); } } public class Thread2 implements Runnable{ @Override public v

爪哇国新游记之十八----泛型栈类

import java.lang.reflect.Array; /** * 泛型栈 * * @param <T> */ public class Stack<T>{ private Class<T> type;// 栈元素所属的类 private int size;// 栈深度 private T[] arr;// 用数组存储 private int top;// 栈顶元素的下标 public Stack(Class<T> type,int size){ t