二分查找法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找法相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

using namespace std;

/**
 * 二分查找,要求输入数列有序方可查询。常用于变动比较小的数据,且有序。时间复杂度可以表示O()=O(logN)
 * 返回查找值所在的下标 (此为升序)
 *
 * start指向数组待查范围的起始元素,end指向数组待查范围的最后一个元素,middle=(start+end)/2。开始时待查范围为整个数组。
    比较array[middle]与查找元素的大小关系:
    如果array[middle]等于查找元素,则查找成功
    如果array[middle]大于查找元素,则说明待查元素在数组的前半部分,此时缩小待查范围,令end = middle-1
    如果array[middle]小于查找元素,则说明待查元素在数组的后半部分,此时缩小待查范围,令start = middle +1
    重复执行前面两步,直到array[middle ] 等于查找元素则查找成功或start>end查找失败。
 */
int binary_search(const int arr[],int start, int end, int value)
{
    if(start > end)
        return -1;

    int mid = start + (end - start) / 2; //middle=(start+end)/2: start+end容易溢出
    if(arr[mid] == value)
        return mid;

    //递归查找
    return (arr[mid] > value ? binary_search(arr,start, mid-1, value) : binary_search(arr,mid+1, end, value));
}

int main()
{
    int a[]={10,22,42,51,56,63,78,99,102,110,123,134};

    int result = binary_search(a,0, sizeof(a)/sizeof(int), 102);
    printf("%d\n",a[result]);

}

 

以上是关于二分查找法的主要内容,如果未能解决你的问题,请参考以下文章

Jdk之中的二分查找法

简单算法------二分查找法

二分查找法

二分查找法

二分查找法

算法丨二分查找法