1,问题描述:
N个有序整数数列已放在一维数组中,利用二分查找法查找整数 m在数组中的位置若找到,则输出其下标值;反之,则输出“Not be found!”。

2.问题分析:
二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,这些子问题互相独立且与原问题相同,通过对较小规模问题的求解达到对整个问题的求解。我们把将问题分解成两个较小问题求解的分治方法称为二分法。需要注意的是,二分查找法只适用于有序序列。二分查找的基本思想是:每次查找前先确定数组中待查的范围,假设指针 low和high(low<high)分别指示待查范围的下界和上界,指针mid指示区间的中间位置,即mid(low+high)/2,把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下一次的查找范围放在中间位置之前的元素中。直到1ow>high,查找结束。

3.算法设计:
N个有序数应存放在数组中根据数组下标的取值范围知指针low和high的初值分别为0N-1。除了三个指针变量ow、high、mid之外还需要一个变量(假设为k)来记录下标,利用变量k的值来判断整数m是否在所给出的数组中。下面我们用示意图来表示二分
查找的过程。假设一维数组中存储的有序数列为51319213766475808892要查找的整数m为21根据二分查找方法可知指针lw和high 最初分别指向元素5和92,由mid= (low+high)/2知指针mid指向元素56。示意图如下:

                                                                            

变量m所代表的整数21与指针mid 所指的元素56进行比较,21小于56,根据二分查找算法知查找范围现在缩小到指针 mid 所指元素的前面即从5~37的范围指针high原来指向下标为N-1的元素,现在指向下标为mid-1的元素,接着重新计算指针mid所指元素的下标。

                                                               

再次进行比较,21大于19,现在比较范围再次转移到mid 所指元素的后面,low 元素所指元素下标由0变为mid+1。

                                                                

当前 mid 所指元素的值为21,与要查找的整数值相同,因此查找成功,所查元素在表中序号等于指针mid的值。查找不成功的过程请读者自己完成。

4.程序流程图:

5.源代码:

#include<stdio.h>
#define N 10
int main()
{
    int i,a[N]={-3,4,7,9,13,45,67,89,100,180},low=0,high=N-1,mid,k=-1,m;
    printf("a数组中的数据如下:\n");
    for(i=0;i<N;i++)
        printf("%d\n",a[i]);
    printf("Enter m:");
    scanf("%d",&m);
    while(low<=high)
    {
        mid=(low+high)/2;
        if(m<a[mid])
            high=mid-1;
        else
            if(m>a[mid])
            low=mid+1;
        else
        {
            k=mid;
            break;
        }
    }
    if(k>=0)
        printf("m=%d,index=%d\n",m,k);
    else
        printf("Not be fond!\n");
    return 0;
}