二分法(折半查找法)小demo

使用此算法,必须有一个前提,那就是数组必须是有序的。
package com.ly.tcwireless.international.test;

import org.junit.Test;

public class ErFerFaTest extends BaseTest{
    @Test
    public void myTest(){
        int[] arr = {10, 12, 15, 17, 19, 20, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 46};
        int target = 32;
        
        int index = halfSearch(arr, target);
        System.out.println(index);
    }
    
    /**
     * 二分法
     * @param arr
     * @param target
     * @return
     */
    private int halfSearch(int[] arr, int target){
        int min = 0;//数组最小索引
        int max = arr.length - 1;//数组最大索引
        int mid = (min + max) / 2;//数组中间索引
        
        int i = 0;
        while(true){
            System.out.println("第" + ++i + "次,min:" + min + ";mid:" + mid + ";max:" + max);
            //跟中间值进行比较
            if (target > arr[mid]) {
                min = mid + 1;
            }
            else if (target < arr[mid]) {
                max = mid - 1;
            }
            else if(target == arr[mid]){
                return mid;
            }
            //重新取中间索引
            mid = (min + max) / 2;
            //如果最小索引大于最大索引说明有问题,直接返回
            if (min > max) {
                return -1;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/subendong/p/9565461.html