首页 > 编程语言 >二分查找算法的起步判定优化

二分查找算法的起步判定优化

时间:2022-10-04 16:32:55浏览次数:52  
标签:二分 数字 int mid high 算法 查找 low

package com.example.grokkingalgorithmsdemo.binarysearch;

import lombok.extern.slf4j.Slf4j;

/**
* @Author: Frank
* @Date: 2022-06-04 12:12
*/
@Slf4j
public class BinarySearchJ {

private static Integer binarySearch(int[] list,int item){
int low = 0;
int high = list.length-1;
if (item<list[low] || item>list[high]){
//if smaller than low or bigger than high,
//then meaning not the element in the collection.
log.info("not in this collection,return null");
return null;
}
//当两个下标还没有挨在一起或刚刚挨在一起时
while(low<=high){
log.info("start while~~");
//获取中间数
int mid = (low+high)/2;
//猜测列表中的这个中间数是否是要检索的数据
int guess = list[mid];
//如果是,直接返回
if(guess==item){
return mid;
}
//如果猜测的数字是大于传入的要检索的数字时,
//此时二分查找的策略是,既然中间数不是,那么就将包括中间数的所有大的数字都排除掉
if(guess>item){
high=mid-1;
}else{
//否则如果猜测的数小于传入的要检索的数字时,
//此时二分查找的策略则为,既然中间数不是,并且真正的数字大于现在猜测的中间数,
//那么肯定要提高现在的中间数,即将最小部分的数字提升到现中间数+1
low = mid+1;
}
}
return null;
}

/**
* 这些都建立在数据在排好序的情况下,如果不是排好序的情况,需要先进行排序
* 才可以执行二分查找
* @param args
*/
public static void main(String[] args) {
int[] myList = {1,3,5,7,9};

System.out.println(binarySearch(myList,3)); //1
System.out.println(binarySearch(myList,-1));//null
}
}

在二分查找算法中,有一个奇怪的地方,当给定要查找数字item,不在这个集合中,
也就是肯定大于最大值或小于集合最小值,那么肯定是不存在这集合中的。

当加入第15行判定之后,当给定数字-1被算法要求查找后(第55行代码),会进入if smaller than low or bigger than high的判定。

而如果不加入判定,计算是-1也会进入while循环并执行3次。



标签:二分,数字,int,mid,high,算法,查找,low
From: https://blog.51cto.com/u_11956468/5731345

相关文章

  • 经典算法
     算法稳定性稳定性是指在一组待排序记录中,如果存在任意两个相等的记录R和S,且在待排序记录中R在S前,如果在排序后R依然在S前,即它们的前后位置在排序前后不发生改变,则......
  • 冒泡排序算法
    冒泡排序算法(BubbleSort)算法是一种简单的排序算法,它在重复访问要排序的元素列时,会依次比较相邻的两个元素,如果左边的元素大于后边的元素,就将二者交换位置,如此重复,......
  • 【Python】第3章-4 查找指定字符
    本题要求编写程序,从给定字符串中查找某指定的字符。输入格式:输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。输出格式:如果找到,......
  • 二分查找算法
    二分查找算法又叫做折半查找,要求待查找的序列有序,每次查找都取中间的值与待查关键字进行比较,如果中间位置的值比待查关键字大,则在序列的左半部分继续执行该查找过程,如......
  • 牛客网高频算法题系列-BM16-删除有序链表中重复的元素-II
    牛客网高频算法题系列-BM16-删除有序链表中重复的元素-II题目描述给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。原题目见:BM......
  • AcWing 算法提高课 矩阵乘法
    可以用快速幂的形式求大量的相同矩阵乘法。1、快速幂求斐波那契数列的第n项(n很大)先将斐波那契数列的递推转化成矩阵形式 然后用快速幂求解A^n 例题:求斐波那契数列......
  • 手写现代前端框架diff算法-前端面试进阶
    前言在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用......
  • 计算机系统进程调度算法
    不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。批处理系统批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终......
  • AcWing算法提高课 中国剩余定理 求解多个线性同余方程
        注意这里是构造了一个解,ti由于Mi与mi互质,可以用ExGCD求解例题:https://www.acwing.com/problem/content/1300/模板:#include<bits/stdc++.h>usingnamespac......
  • 0464-如何离线分析HDFS的FsImage查找集群小文件
    温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:​​https://github.com/fayson/cdhproject​​提示:代码块部分可......