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; }
浙公网安备 33010602011771号