查找算法——————二分搜索

最常见的判断是存在key,如果存在输出位置,否则输出-1.

int BinSearch(int l,int r,int key){ //judge exist
    int md;
    while(l <= r){
        md= (l+r)/2;
        if(key < a[md]){
            r = md - 1;
        }else if(key > a[md]){
            l = md + 1;
        }else{
            return md;
        }
    }
    return -1;  //no exist
}

  

如果要求是大于等于key的最小位置时。只需要把下面的判断条件改为 key <= a[md] 即可。同时注意传过来的l, r的边界。

int BinSearch(int l,int r,int key){ //大于key的最小位置
    int md = (l+r)/2;
    while(l < r){
        md = (l+r)/2;   //由于向下取整,所以不用调整
       // printf("%d %d %d+++\n",l,r,md);
        //getchar();
        if(key < a[md]){
            r = md;
        }else{
            l = md + 1;
        }
    }
    return l;
}

  

如果要求是小于等于key的最大位置。只需要把下面的判断条件改为 key >= a[md] 即可。

int BinSearch(int l,int r,int key){ //小于key的最大位置
    int md = (l+r)/2;
    while(l < r){
        md = (l+r+1)/2; //需要+1调整。因为满足key>a[md]会出现死循环
       // printf("%d %d %d+++\n",l,r,md);
        if(key > a[md]){
            l = md;
        }else{
            r = md-1;
        }
    }
    return l;
}

  

时间: 2024-08-10 23:15:35

查找算法——————二分搜索的相关文章

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

从零开始_学_数据结构(四)——查找算法、索引、二叉排序树

查找算法 基本概念: (1)关键字:假如有结构 struct Node //一个结点,存储数据和指针 { DATA data; //数据属性,用于存储数据 int key; //假设key为int值,其在整个表里是唯一的 //指针域,具体略,指向其他结点,或者是数组的下标 }; key值便是关键字,对于每一个结点而言,其key值都是不一样的(不一定必须是int值).因此,当我们查找数据时,只要知道其key值,然后对比key值和我们要查找的key值是否相同,便能判断是否是我们要查找的数据了. 优点

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

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

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧

常见的查找算法(三):插值查找

插值搜索法(Interpolation search)是利用插值公式来计算猜测搜索键值的位置.搜索方式与二分搜索相同 插值公式: 插值 = (设算数 -­ 最小数) / (最大数 -­ 最小数): [2] 搜索键值 = left + parseInt( ( key - data[ left ] ) / ( data[ right ] - data[ left ] ) ) * ( right - left ) ) 插值搜索之算法与二分搜索算法几乎完全相同,差别在: 二分搜索法:猜测键值在中间位置(

排序、查找算法

1> 插入排序 //插入排序(把第一个当作也排好序,然后对后面的依次插入到已排好序的队列中)平均时间复杂度0(n^2) public void insertSort(int[] a){ for(int i = 1;i<a.length;i++){ for(int j = i;j > 0;j--){ if(a[j] < a[j-1]){ int tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } } 2> 希尔排序 /*希尔排序:平均时

二分查找算法的 JavaScript 实现

二分查找在查找[指定值]在[有序]数据中的[位置]时是一种高效的算法. 以下仅提供 ES5 版本. var arr = [0, 2, 4, 27, 28, 54, 67, 74, 75, 79, 86, 97, 289, 290, 678] function binarySearch(arr, val) { var start = 0, end = arr.length - 1; while (start <= end) { var mid = Math.floor((start + end)

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>