二分查找是一个常用的查找算法,其原理在于通过不断切分一个规则排序,对半的去寻找目标元素所在的区间与位置。但是其有一个前提,那就是数据结构需要是顺序存储结构,并且关键字大小有序排列。例子如下:

例:
有一个数列:12,23,45,56,67,89 请使用二分查找找到56的位置

解:
首先mid=(0+5)/2=2;
arr[2]位置放的是45,56大于45,所以在56,67,89之间进行查找,mid=(3+5)/2=4,arr[4]=67,这时67大于56,所以mid=(3+3)/2=3,arr[3]=56,成功找到56的位置,返回index=3
算法实现如下:

void HalfSearch(int arr[], int low, int high,int key)
{
    int count = 0;
    int count1 = 0;
    while (low<=high)
    {
        count++;
        int mid = (low + high) / 2;
        if (key > arr[mid] )
        {
            low = mid + 1;
        }
        else if ( key < arr[mid])
        {
            high = mid - 1;
        }
        else
        {
            printf_s("查找到元素%d,位置arr[%d],查找次数%d", key, mid,count);
            count1++;
            break;
        }
    }
    if (count1 == 0)
    {
        printf_s("查找失败!");
    }
}

void main()
{
    int arr[6] = { 12,23,33,66,88,99 };
    HalfSearch(arr,0,5,66);
}

二分搜索时间复杂度为:O(log2n)

因为二分查找每次去掉一半的值,所以对于n个元素的情况:

一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4

m次二分剩下:n/(2^m)

在最坏情况下是在排除到只剩下最后一个值之后得到结果,即

n/(2^m)=1

所以由上式可得 : 2^m=n

故时间复杂度为: O(log2n)

posted on 2021-11-11 11:20  LostDog  阅读(144)  评论(0)    收藏  举报