查找算法——折半查找

介绍

折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。

1 ,存储结构一定是顺序存储
2 ,关键字大小必须有序排列

然后,利用这组有序的数据之间的关系,来进行折半的查找。

比方说,这组数据是升序排列的。一开始,首先对比这组数据的中间的项与关键值(key)的关系。若是关键值(key)>中间值,则说明,关键值(key)在中间值的右侧,因此将这组数据的区间缩小为以中间值为最左侧的小区间。然后,继续用中间值进行比较,以此类推,最终肯定会找到在数组当中与之匹配的关键值,直到区间缩小为0还没找到,就只能是关键值(key)不在数组当中

算法分析

折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止。如果x< a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。一直这样搜索下去,时间复杂度为O(log N)

代码实现

/折半查找
void binarySearch(int *arr,int length,int key) {

    //数组左端
    int left = 0;
    //数组右端
    int right = length - 1;
    //中间
    int mid;

    //在左右指针交换之前,查找还没结束
    while (left <= right) {

        //更新中间的值
        mid = (left + right) / 2;

        //查找成功
        if (arr[mid] == key) {
            cout << "find it and its index is " << mid;
            return;
        }

        //若还没有找到,改变左右区间继续寻找
        if (arr[mid] < key)
            left = mid + 1;
        if (arr[mid] > key)
            right = mid - 1;

    }

    cout << "cannot find it" << endl;
    return;

}
    原文作者:查找算法
    原文地址: https://blog.csdn.net/a591243801/article/details/72823916
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞