二分法查找

@Component
public class Sort {

    private static Logger logger = LoggerFactory.getLogger(Sort.class);

    /**
     * 二分法查找
     * 逻辑:
     * 0,与中间元素比较,不断的获取中间元素下标
     * 1,中间下标:(初始索引+结束索引)/2,奇偶无差别
     * mid = (0+9)/2 4 偶
     * mid = (0+8)/2 4 奇
     * 2,定位初始和结束下标,目标所处中间下标位置
     * mid右侧,low = mid + 1
     * mid左侧,upper = mid - 1
     *
     * @return
     */
    public static int search(int[] number, int des) {
        int low = 0;
        int upper = number.length - 1;// 最大下标
        while (low <= upper) {
            int mid = (low + upper) / 2;
            if (number[mid] < des) {
                low = mid + 1;
            } else if (number[mid] > des) {
                upper = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

/**
 * 测试
 * @param args
 */
public static void main(String[] args) {
    int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int des = 2;
    int result = search(number, des);
    if (result == -1) {
        logger.info("未找到");
    } else {
        logger.info("{}已找到:{}", "shenke", result);
    }
}

}

 https://blog.csdn.net/happyzwh/article/details/80398519

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。

假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1。代码如下:

 

package cn.sunzn.dichotomy;

public class DichotomySearch {
   public static void main(String[] args) {
       int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 };
       System.out.println(search(arr, 12));
       System.out.println(search(arr, 45));
       System.out.println(search(arr, 67));
       System.out.println(search(arr, 89));
       System.out.println(search(arr, 99));
   }

   public static int search(int[] arr, int key) {
       int start = 0;
       int end = arr.length - 1;
       while (start <= end) {
           int middle = (start + end) / 2;
           if (key < arr[middle]) {
               end = middle - 1;
           } else if (key > arr[middle]) {
               start = middle + 1;
           } else {
               return middle;
           }
       }
       return -1;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值