zoukankan      html  css  js  c++  java
  • 数组07 零基础入门学习C语言29

    第六章:数组07

     

    让编程改变世界

    Change the world by program


     

    二维数组程序举例 -- 二分法举例

     

    假设在数组a中的数据是按由小到大顺序排列的:

    -12 0 6 16 23 56 80 100 110 115,从键盘上输入一个数,判定该数是否在数组中,若在,输出所在序号。  

    TIPS:

    第一步:设low、mid和high三个变量,分别指示数列中的起始元素、中间元素与最后一个元素位置, 其初始值为low=0,high=9,mid=4,判断mid指示的数是否为所求,mid指示的数是23,不是要找的80,须继续进行查找。 [caption id="attachment_109" align="aligncenter" width="361"] 二分法原理[/caption]   第二步:确定新的查找区间。因为80大于23,所以查找范围可以缩小为23后面的数,新的查找区间为[56 80 100 110 115 ],low,mid,high分别指向新区间的开始、中间与最后一个数。实际上high不变,将low(low=mid+1)指向56,mid (mid=(low+high)/2)指向100,还不是要找的80,仍须继续查找。 [caption id="attachment_110" align="aligncenter" width="363"] 二分法原理[/caption]   第三步:上一步中,所找数80比mid指示的100小,可知新的查找区间为[56 80],low不变,mid与high的值作相应修改。mid指示的数为56,还要继续查找。 [caption id="attachment_111" align="aligncenter" width="366"] 二分法原理[/caption]   第四步:根据上一步的结果,80大于mid指示的数56,可确定新的查找区间为[80],此时,low与high都指向80,mid亦指向80,即找到了80,到此为止,查找过程完成。 [caption id="attachment_112" align="aligncenter" width="356"] 二分法原理[/caption]   注意:若在查找过程中,出现low > high的情况,则说明,序列中没有该数,亦结束查找过程。

    代码清单:

    [codesyntax lang="c"]
    #define M 10
    #include<stdio.h>
    
    void main()
    {
    	static int a[M] = {-12,0,6,16,23,56,80,100,110,115};
     	int n, low, mid, high, found;
    
    	low=0;    
    	high=M-1;    
    	found=0;
    	printf("Input a number to be searched:");
     	scanf("%d", &n);
    
        //以上进行一系列预处理……
    
        while(low <= high)
        {
            mid = (low+high)/2;
            if(n == a[mid]) 
            {
                found = 1;     
                break;
            } /*找到,结束循环*/     	
            else 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);
    }
    [/codesyntax] [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LOAOVYTAAFSL']视频下载[/Downlink]
  • 相关阅读:
    C++中使用多线程
    hdu 4223 dp 求连续子序列的和的绝对值最小值
    hdu 1372 bfs 计算起点到终点的距离
    hdu 4217 线段树 依次取第几个最小值,求其sum
    心得
    hdu 1175 bfs 按要求进行搜索,是否能到达,抵消两个(相同)棋子
    hdu 4221 greed 注意范围 工作延期,使整个工作时间罚时最少的单个罚时最长的值
    hdu 2844 多重背包 多种硬币,每一种硬币有一点数量,看他能组成多少种钱
    uva LCDDisplay
    hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846958.html
Copyright © 2011-2022 走看看