美文网首页C++数据结构和算法分析程序员
小朋友学数据结构(6):折半查找法

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

作者: 海天一树X | 来源:发表于2018-05-09 17:13 被阅读63次

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

(一)基本思想

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

2.png

(二)时间复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[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语言实现

#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;
}

运行结果:

Index of 7 is 6

TopCoder & Codeforces & AtCoder交流QQ群:648202993
更多内容请关注微信公众号


wechat_public_header.jpg

相关文章

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

    折半查找法又称为二分查找法。 (一)基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,...

  • 算法:二分法查找(折半查找法)

    算法:二分法查找(折半查找法) 这是最经典的折半查找,而在面试的时候往往会对某些经典的数据结构和算法进行魔改,这道...

  • 排序算法

    算法与数据结构基础 查找算法: 二分查找法: 简介:二分查找法又被称为折半查找法,用于预排序的查找问题 过程: 如...

  • 查找算法

    1.顺序查找法 改进后的顺序查找法 2.折半查找法 3.插值查找 插值查找其实是折半查找的升级版,在我们写折半查找...

  • 【爬虫】数据结构实现折半查找的算法

    数据结构实现折半查找的算法 折半查找技术,也就是二分查找,通常称为二分法查找。它的前期是线性表中的记录必须是关键码...

  • 折半查找法

    但是如果数组长度很大很大,使得low和high之和超出了limits.h中定义的有符号整数的极限值,那么执行到取数...

  • 算法复习-插入类排序(2)-折半插入排序

    折半插入排序 折半插入排序是根据折半查找法来查找插入位置的。折半查找的一个基本条件是序列已经有序。而从直接插入排序...

  • 算法复习-查找(2)-折半查找法

    折半查找法 折半查找要求线性表是有序的,即表中记录按关键字排序。 代码: ASL分析: 折半查找的过程可以用二叉树...

  • 查找算法

    三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表

  • 数据结构_查找_折半/插入/斐波那契

    数据结构_查找_折半/插入/斐波那契 这三种查找算法都是在数据列有序的前提下进行的 折半查找 对于n个元素的数据列...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/atrorftx.html