SUMMARY | 二分查找

package Search;

public class biSearch {
    //标准的二分查找
    public static int stdBiSearch(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<array[mid]) right=mid-1;
            else if(keyValue>array[mid]) left=mid+1;
            else return mid;
        }
        return -1;
    }

    //(二分法)查找第一个小于keyValue的元素
    public static int BiSearchToFindFirstSmaller(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<=array[mid]) right=mid-1;
            else left=mid+1;
        }
        return right;
    }

    //(二分法)查找第一个大于等于keyValue的元素
    public static int BiSearchToFindFirstBiggerorEqual(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<=array[mid]) right=mid-1;
            else left=mid+1;
        }
        return left;
    }

    //(二分法)查找第一个最后一个小于等于keyValue的元素
    public static int BiSearchToFindLastSmallerorEqual(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<array[mid]) right=mid-1;
            else left=mid+1;
        }
        return right;
    }

    //(二分法)查找第一个第一个大于keyValue的元素
    public static int BiSearchToFindFirstBigger(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<array[mid]) right=mid-1;
            else left=mid+1;
        }
        return left;
    }

    //(二分法)查找第一个第一个等于keyValue的元素
    public static int BiSearchToFindFirst(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<=array[mid]) right=mid-1;
            else left=mid+1;
        }
        //array[right]<keyValue<=array[left]
        if(left<length&&array[left]==keyValue) return left;
        else return -1;
    }

    //(二分法)查找第一个最后一个等于keyValue的元素
    public static int BiSearchToFindLast(int[] array,int keyValue) {
        int length=array.length;
        int left=0,right=length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(keyValue<array[mid]) right=mid-1;
            else left=mid+1;
        }
        //array[right]<=keyValue<array[left]
        if(right>=0&&array[right]==keyValue) return right;
        else return -1;
    }

    //测试样例
    public static void main(String[] args) {
        int[] a=new int[]{0,1,2,2,2,5,6};
        System.out.println(BiSearchToFindLast(a, 2));
    }
}

一张图帮助理解:

参考博客地址:https://www.cnblogs.com/bofengyu/p/6761389.html

原文地址:https://www.cnblogs.com/ustctp/p/9032934.html

时间: 2024-10-14 08:05:06

SUMMARY | 二分查找的相关文章

二分查找/折半查找算法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. class Pr

二分查找(折半查找)

二分查找条件:有序数组. 查找原理:查找过程从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束: 如果某一特定元素大于或小于中间元素,则在数组大于或小于中间原色的那一半中查找,而且跟开始一样从中间元素开始比较. 如果在某一步骤数组为空,则代表找不到. 这种搜索算法每一次比较都使搜索范围缩小一半. 时间复杂度:O(logn) 使用二分查找有两个前提条件: 1,待查找的列表必须有序. 2,必须使用线性表的顺序存储结构来存储数据. 下面是实现代码. C#版: namespace B

C# 二分查找

/// <summary> /// 二分查找 /// </summary> /// <param name="arr">数组</param> /// <param name="low">开始索引 0</param> /// <param name="hight">结束索引 </param> /// <param name="key&qu

优化的直接插入排序(二分查找插入排序,希尔排序)

直接插入排序 (一)概念及实现 直接插入排序的原理:先将原序列分为有序区和无序区,然后再经过比较和后移操作将无序区元素插入到有序区中. 具体如下(实现为升序): 设数组为a[0…n]. 1.        将原序列分成有序区和无序区.a[0…i-1]为有序区,a[i…n] 为无序区.(i从1开始) 2.        从无序区中取出第一个元素,即a[i],在有序区序列中从后向前扫描. 3.        如果有序元素大于a[i],将有序元素后移到下一位置. 4.        重复步骤3,直到找

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

c#二分查找的两种方式

其实:两种方式的实现结果一样,却体现出了不同的思考过程: 地中方式,是在一个while循环中,每次从中间找,不断的去改变low 和 high的 位置,然后求他们的中间位置,知道low=high=0:如果还没有知道值,就直接返回-1: /// <summary> /// 二分查找方式 /// </summary> /// <param name="arr"></param> /// <param name="target&q

二分查找法优化插入排序

通俗的插排是对一个整型数组进行升序排序,可以看出每个元素插入到队列中经过两个步骤:先是挨个比较,找到自己所在的位置:然后把后面的数据全部移位,然后把元素插入. 要把数据插入,移位是必不可少了.那么,挨个比较倒是可以优化,因为要插入的队列已经是排序好的,我们可以使用二分法来减少比较的次数. 二分法的时间复杂度为O(log 2 n),而线性查找的复杂度为O(n). 在对50000个随机数进行测试比较中,发现加了二分查找的插排比普通的插排速度快了将近一倍!(通俗插排7888ms,优化插排4852ms)

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查