栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

算法分析:C语言实现分治算法之二分搜索(折半查找)(递归)与线性查找的比较

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法分析:C语言实现分治算法之二分搜索(折半查找)(递归)与线性查找的比较

 二分搜索的伪码:

 

 二分搜索的解题思路:

              a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]
                1   2   3   4   5   6   7   8     K=3 //输入8位数的数组
  第一次查找:  low=1                       high=8
                mid=(1+8)/2=4       (int整型舍去小数部分)
                K=3a[mid](a[2]=2)  舍去左边小于mid=2的数,这时    low=mid+1=3
                    ↓
               a[3]
  第三次查找:  3      K=3
                
                

        二分搜索的思路:对比查找元素K,如果刚刚好mid等于K则直接返回mid的位置,如果K大于mid,则把小于mid的数放弃掉,如果K大于mid ,则把大于mid的数放弃掉,相当于直接丢弃一半,一直丢弃,直到找到K等于mid。

 递归代码实现:

#include 
#include 
#include 

int Binary_Search(int a[],int k,int low,int high)
{
    if(low>high)return 0;
    else{
        int mid=(low+high)/2;
        if(k==a[mid])return mid;
        else if(k

结果实现:

线性查找 :

#include 
#include 
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int k;
    printf("查找元素:");
    scanf("%d",&k);
    for(int i=0;i<10;i++){
        if(k==a[i]){
            printf("%d在第%d位",k,i+1);
        }
    }
    return 0;
}

         我们可以想,明明可以用几行代码就可以实现一个有序数组的查找,可是为什么偏偏要弄得像二分搜索那样复杂呢? 

        可以直接从“线性查找”的代码看出来,它是一个一个的对比,从0开始到想要搜索的数(即时间复杂度O(n)),这看起来不是比二分搜索更加简洁方便嘛?

       参考一些资料↓

         在《算法设计技巧与分析》沙特版中对二分搜索算法的时间复杂度分析为O(log n)

        通过函数来对比一下y=n与y=log n的差别

        在0

         在0

        由上图可得,当n很大时,O(n)的耗费的时间远远要比O(logn)所耗费的时间要多! 所以二分搜索的重要性是可想而知的,也是必要的!

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号