zoukankan      html  css  js  c++  java
  • 二分法查找(初学者)

    适用情况:在一批有序数据中查找某数。

    基本思想:

    1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.

    2 求区间(a,b)的中点c.

    3 计算f(c).

    (1) 若f(c)=0,则c就是函数的零点;

    (2) 若f(a)·f(c)<0,则令b=c;

    (3) 若f(c)·f(b)<0,则令a=c.

    (4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.

    例:假设数组a中的数据是按由小到大的顺序排列的:-12,0,6,16,23,56,80,100,110,115,从键盘上输入一个数,判定该数是否在该数组中,若在,输出所在序号。

    (假设输入的数为80)第一步:设low、mid和high三个变量,分别指向数列中的起始元素,其初始值为low=0,high=9,mid=4,判断mid指示的数是否为所求。mid指示的数是23,不是要找的80,仍继续查找。

    第二步:确定新的查找区间,因为80大于23,所以查找的范围可以缩小为23后面的数,新的查找区间为[56,80,100,110,115],low,mid,high分别指向新区间的开始,中间和最后一个数。实际上high不变,将low(low=mid+1)指向56,mid(mid=(low+high)/2)指向100,还不是要找的80,仍继续查找。

    第三步:上一步中,所找数80比mid指示的100小,可知新的查找区间为[56,80],low不变,mid与high的值作相应修改。mid指示的数为56,还要继续查找。

    第四步:根据上一步的结果,80大于mid指示的数56,可确定新的查找区间为[80],此时,low与high都指向80,mid亦指向80,即找到了80,到此为止,查找过程完成。

    注:若在查找过程中,出现low>high的情况,则说明,序列中没有该数,亦结束过程。

    参考程序:

    #include <stdafx.h>
    #include<stdio.h>
    
    void main()
    {
        int a[10]={-12,0,6,16,23,56,80,100,110,115},low,mid,high,found,n;
        low=0;
        high=9;
        mid=4;
        found=0;
        printf("Input a number to be searched:");
        scanf("%d",&n);
        for(;low<=high;mid=(low+high)/2)
        {
            if(n==a[mid])
            {
                found=1;
                break;
            }
            if(n>a[mid])
            {
                low=mid+1;
            }
            else
            {
                high=mid-1;
            }
        }
        if(found==1)
        {
            printf("The index of %d is %d",n,mid);
        }
        else
        {
            printf("There is not %d",n);
        }
        
    
    }

     

     

     
  • 相关阅读:
    绝对干货:供个人开发者赚钱免费使用的一些好的API接口
    科普技术贴:个人开发者的那些赚钱方式
    北漂程序员的笑与泪
    非著名程序员公众号
    北漂程序员的笑与泪
    【有人@我】Android中高亮变色显示文本中的关键字
    新时代的coder如何成为专业程序员
    自定义圆形控件RoundImageView并认识一下attr.xml
    偷天换日:网络劫持,网页js被伪装替换。
    jeesite 去掉 /a
  • 原文地址:https://www.cnblogs.com/lvfengkun/p/10322084.html
Copyright © 2011-2022 走看看