我是靠谱客的博主 苹果皮卡丘,最近开发中收集的这篇文章主要介绍二分查找算法(折半查找算法),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二分查找又称折半查找。
优点:比较次数少,查找速度快,平均性能好;
缺点:要求待查表为有序表,且插入删除困难。

折半查找方法适用于不经常变动而查找频繁的有序列表。
1、首先,假设表中元素是按升序排列
2、将表中间位置记录的关键字与查找关键字比较
3、如果两者相等,则查找成功;
4、否则利用中间位置记录将表分成前、后两个子表,
5、如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
6、重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

时间复杂度就是while循环的次数 O(logn)

#include <iostream>
using namespace std;

//low和high是指的是对应的数组的下标 。
int BinSearch(int array[],int low,int high,int target)
{
    while(low <= high)
    {
        /*使用(low+high)/2会有整数溢出的问题。
          问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
          这样,产生溢出后再/2是不会产生正确结果的。
          而low+((high-low)/2)不存在这个问题*/
        int mid  =low +(high - low)/2;

        if(array[mid] > target)
        {
            high = mid - 1; 
        }
        else if(array[mid] < target)
        {
            low = mid + 1;  
        }
        else
        {
            return mid; 
        }
    }
    return -1;
}

int main()
{
    int a[]={1,2,3,4,5};
    int result = BinSearch(a,0,4,1);
    cout << result << endl;
}

递归算法:

#include <iostream>
using namespace std;

int k;

int found(int a[],int x,int y)
{

    int mid = x + (y - x)/2;
    //递归结束的条件
    if(x > y)
    {
        return -1;
    }
    else
    {
        if(a[mid] == k)
        {
            return mid;
        }
        else if(a[mid] > k)
        {
            return found(a, x , mid - 1);
        }
        else
        {
            return found(a, mid + 1,y); 
        }
    }
}
int main()
{
    int a[]={1,2,3,5,7,8,9,10,34,45};
    while(cin >> k)
    {
        cout << found(a,0,9) << endl;
    }
    return 0;
}

递归的另一种方式:

int found(int a[],int start,int end)
{

    int mid = start+ (end- start)/2;
    //递归结束的条件
    if(start> end)
    {
        return -1;
    }
    else
    {
        if(a[mid] == k)
        {
            return mid;
        }
        else if(a[mid] > k)
        {
            end = mid - 1;
        }
        else
        {
            start = mid + 1;
        }
        return found(a,start,end);
    }
}

最后

以上就是苹果皮卡丘为你收集整理的二分查找算法(折半查找算法)的全部内容,希望文章能够帮你解决二分查找算法(折半查找算法)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部