有序数组中的二分查找

最近看一些算法题发现这些问题到最后落实到编程实现上都是一种基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解。所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远。目前应该坚持基础,打好基础,毕竟不是CS科班出身。言归正传,二分查找就是一个最基础的算法。它的时间复杂度O(logn)。分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正。

int BinarySearch(int * a, int beg, int end, int elem)
{
    if(beg <= end)
    {
        int mid = (beg + end ) / 2;
        if(a[mid] == elem)
        {
            return mid;
        }
        else if(a[mid] > elem)
        {
            end = mid-1;
        }
        else
        {
            beg = mid+1;
        }
        return BinarySearch(a, beg, end, elem);
    }
    else
    {
        return -1;
    }
}
int BinarySearchRecursive(int *a, int length, int elem)
{
    if(a == NULL || length <=0)
    {
        return  -1;
    }
    return BinarySearch(a, 0, length-1, elem);
}
int BinarySearchIterator(int *a, int length, int elem)
{
    if(a == NULL || length <=0)
    {
        return  -1;
    }
    int beg = 0;
    int end = length-1;
    int mid = 0;
    while(beg <= end)
    {
        mid = (beg + end) / 2;
        if(a[mid] == elem)
        {
            return mid;
        }
        else if(a[mid] > elem)
        {
            beg = mid + 1;
        }
        else
        {
            end = mid - 1;
        }
    }
    return -1;
}

这里主要注意二分查找时,两个下标的变化,以及最终结束查找的判断条件是beg>end(查找失败),或者(a[mid]==end)。时间有限,代码质量一般,轻喷。

时间: 2024-08-01 22:47:24

有序数组中的二分查找的相关文章

算法—8.有序数组中的二分查找

1.具体算法 /** * 算法3.2 二分查找(基于有序数组) * Created by huazhou on 2015/11/29. */ public class BinarySearchST<Key extends Comparable<key>, Value> { private Key[] keys; private Value[] vals; private int N; public BinarySearchST(int capacity){ keys = (Key[

使用二分查找向一个有序数组中插入一个数据

折半查找法找到一个元素在数组中的下标 * @param arr 数组 * @param key 要查找的元素 * @return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置 * 如:[1,4,6,7,10,11,15],查找8在数组中的位置,如果存在则返1,不存在则返回在7这个下标+1的这个位置上, 也就是说在返回10所在位置上的下标 */ public static int arrayIndexOf(int[] array,int key) { int min,

C语言编程 在整型有序数组中查找想要的数字并且返回下标

遇到"有序"数组中查找元素类的题,优先考虑折半查找(二分查找) 做法核心是利用所定义的下标left和right与mid(由计算得来)下标的比较来逐渐缩短查找范围,达到一个阈值后即为找到. 源代码如下: #include<stdio.h> #include<stdlib.h> int search(int a[], int x, int left, int right)//定义二分查找函数 { while (left <= right) { int mid

找到轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[size]) { l = mid + 1;

找轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[r]) { l = mid + 1; }

找出有序数组中绝对值最小的数

问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值. 方法1: 遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数. 方法2: 二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn). 分析步骤: 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场: 如果a[mid]<0,因为数组是升序,说明绝对值

二分法计算有序数组中数字出现的次数

1. 问题描述 在给定的一个已经排好序的数组中,找出指定数字出现的次数.例如数组[1,2,3,4,4,4,4,6,8,9]中4出现的次数为4次. 2. 思路与方法 此问题可以在二分法的基础上进行改进.假设数组a为递增的数列,需要查找的数字为num,可以分别查找num在数组a中出现的起始位置和最后一次的位置,通过二者的差计算出数字num在数组a中出现的次数. c++代码如下: #include <stdio.h> #include <iostream> #include <st

如何在有序数组中给出指定数字出现的次数

问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{1,2,2,2,3,4,5} 数字2的出现次数为3. 最简单的方法是遍历数组,代码如下: #include <stdio.h> //如何在有序数组中给出指定数字出现的次数 int binarysearch(int *a,int n,int x) { int cnt=0; for(int i=0;i<n;i++) { if(a[i]==x) cnt++; } return cnt; } int main() { int a[10

STL中的二分查找——lower_bound 、upper_bound 、binary_search

STL中的二分查找函数 1.lower_bound函数 在一个非递减序列的前闭后开区间[first,last)中,进行二分查找查找某一元素val,函数lower_bound()返回大于或等于val的第一个元素位置(即满足条件a[i]>=val(first<=i<last)的最小的i的值),当区间的所有元素都小于val时,函数返回的i值为last(注意:此时i的值是越界的!!!!!). 比如:已知数组元素是a[10]={0,2,2,2,6,8,10,16,60,100} 当val=0时,函