前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小朋友学数据结构(6):折半查找法

小朋友学数据结构(6):折半查找法

作者头像
海天一树
发布2018-07-25 12:26:05
6250
发布2018-07-25 12:26:05
举报
文章被收录于专栏:海天一树海天一树

折半查找法又称为二分查找法。

(一)基本思想

假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录,此时查找成功;或直到子表不存在为止,此时查找不成功。

(二)时间复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x。 时间复杂度就是求while循环的次数。 假设总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k,其中k就是循环的次数。 由于n/2^k取整后>=1,令n/2^k=1, 可得k=log2(n),(以2为底n的对数)。 所以时间复杂度可以表示为O(h)=O(log2(n))

(三)优缺点

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

(四)C语言实现

代码语言:javascript
复制
#include<stdio.h>
// 递归实现
int recur_bin_search(int a[], int low, int high, int key)
{
    if(low > high)
    {
        return -1;
    }
    int mid = (low + high) / 2;
    if(key == a[mid])
    {
        return mid;
    }
    else if(key < a[mid])
    {
        return recur_bin_search(a, low, mid - 1, key);
    }
    else
    {
        return recur_bin_search(a, mid + 1, high, key);
    }
}
// 非递归实现
int bin_search(int a[], int n, int key)
{
    int low ,high, mid;
    low = 0;
    high = n - 1;
    while(low <= high)
    {
        mid = (low + high) / 2;
        if(key == a[mid])
        {
            return mid;
        }
        else if(key < a[mid])
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }
    return -1;
}
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int num = 7;
    int cnt = sizeof(a) / sizeof(int);
    int index = recur_bin_search(a, 0, cnt - 1, num);
    //int index = bin_search(a, cnt, num);
    if(-1 == index)
    {
        printf("Not found\n");
    }
    else
    {
        printf("Index of %d is %d\n", num, index);
    }
    return 0;
}

运行结果:

代码语言:javascript
复制
Index of 7 is 6

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海天一树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)基本思想
  • (二)时间复杂度
  • (三)优缺点
  • (四)C语言实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档