zoukankan      html  css  js  c++  java
  • 小朋友学数据结构(6):折半查找法

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

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

    (一)基本思想

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

     
    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
    ");
        }
        else
        {
            printf("Index of %d is %d
    ", num, index);
        }
    
        return 0;
    }
    

    运行结果:

    Index of 7 is 6


  • 相关阅读:
    css3圆角细节
    css3伪元素
    使用vscode在谷歌上运行代码
    SpringCloud-技术专区-Gateway优雅的处理Filter抛出的异常
    SpringCloud-技术专区-Gateway全局通用异常处理
    Mybatis-技术专区-插件开发指南
    消息中间件-技术专区-RabbitMQ基本介绍
    SpringBoot-技术专区-自定义TaskExecutor线程池
    MySQL-技术专区-Binlog和Redolog的介绍
    SpringBoot-技术专区-Redis同数据源动态切换db
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9607582.html
Copyright © 2011-2022 走看看