简单算法4--二分法查找

package datastrucates.arrays.order;

public class OperationArraysDichotomySearch {
    private int[] datas = null;

    private int currentIndex = 0;

    public OperationArraysDichotomySearch(int length) {
        datas = new int[length];
    }
    /**
     * 首先的保证数组的数据是有顺序的 当前默认是升序
     * @param data
     * @return
     */
    public int insert(int data) {

        // 比较数据大小 找到比传入 数据大的 索引 假设是升序
        int index = 0;
        for (index = 0; index < currentIndex; index++) {
            if (datas[index] > data) {
                break;
            }
        }
        // 将大于索引的数据向后移一位
        for (int i = currentIndex; i > index; i--) {
            datas[i] = datas[i - 1];
        }
        // 将空出来的位置填充
        datas[index] = data;
        currentIndex++;
        return index;
    }

    /**
     * 二分法查找数字
     * 
     * @param data
     * @return
     */
    public int dichotomySearch(int data) {
        int index = -1;

        int lowIndex = 0;

        int highIndex = currentIndex - 1;
        while (true) {
            index = (lowIndex + highIndex) / 2; //每次讲数组一分为二

            if (lowIndex > highIndex) {//已经交叉还没有找到,表示数组中不存在
                return -1;

            } else if (datas[index] == data) {//找到元素
                return index;

            } else if (datas[index] > data) {//比当前元素大,表示数字大一边向小的一边移动

                highIndex = index - 1;

            } else {//反之 小的向大的移动
                lowIndex = index + 1;
            }
        }

    }
    /**
     * 查找某个数字
     * @param data
     * @return
     */
    public int selectOne(int data) {
        
        int index=dichotomySearch(data);
        if(index>0) {
            return index;
        }
        return -1;
    }
    
    public void printDatas() {
        System.out.println("+++++++++++++++++++++++");
        for(int d:datas) {
            System.out.println(d);
        }
    }
    
    public static void main(String[] args) {
        OperationArraysDichotomySearch arrays = new OperationArraysDichotomySearch(10);
        arrays.insert(1);
        arrays.insert(4);
        arrays.insert(3);
        arrays.insert(6);
        arrays.insert(0);

        arrays.printDatas();
        int data = arrays.selectOne(5);
        System.out.println("returnIndex--->" + data);
    }

}
---运行结果 不存在的情况

+++++++++++++++++++++++
0
1
4
4
6
0
0
0
0
0
returnIndex--->-1
 

--存在的情况

    public static void main(String[] args) {
        OperationArraysDichotomySearch arrays = new OperationArraysDichotomySearch(10);
        arrays.insert(1);
        arrays.insert(4);
        arrays.insert(3);
        arrays.insert(6);
        arrays.insert(0);

        arrays.printDatas();
        int data = arrays.selectOne(1);
        System.out.println("returnIndex--->" + data);
    }

 

+++++++++++++++++++++++
0
1
3
4
6
0
0
0
0
0
returnIndex--->1
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值