折半查找
折半查找,必须是对有序表(一般为递增顺序)进行查找,定义low指针为0,首先将有序表中间关键字key与要查找的key进行比较,相等则成功,若表中记录key大于查找key,则移动hign指针,high=mid-1;在[low,mid-1]中查找,若记录key小于查找key,则移动low指针,**low=mid+1;**在[mid+1,high]中查找,当mid值相等时查找成功.若都不可以则要查找key不在当前有序表中。
#include <stdio.h>
#include<stdio.h>
#define MAX 100 //定义表中最多记录个数
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)< (b))
typedef int KeyType;
typedef struct
{
KeyType key; //KeyType为关键字的数据类型 //其他数据
} SSTable;
typedef SSTable SeqList[MAX]; //顺序表类型
int BinSearch(SeqList R,int n,KeyType key) //折半查找算法R代表位置
{
int low=0,high=n-1,mid,count=0;
while (low<=high)
{
mid=(low+high)/2;
printf("第%d次比较:在[%d,%d]中比较元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
if (EQ(key,R[mid].key)) //查找成功返回
return mid;
if (LT(key,R[mid].key)) //继续在R[low..mid-1]中查找
high=mid-1;
else
low=mid+1; //继续在R[mid+1..high]中查找
}
return -1;//查找失败返回-1
}
int main()
{
SeqList R;
KeyType key;
int i,n,a[MAX];
printf("请输入建立顺序表的长度:\n");
scanf("%d",&n);
printf("请输入要建立的顺序表:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n;i++)
R[i].key=a[i];
printf("所建有序表为:\n");
for (i=0;i<n;i++)
printf("%d ",R[i].key);
printf("\n");
printf("输入要查找的关键字元素:\n");
scanf("%d",&key);
printf("查找%d的结果如下:\n",key);
if ((i=BinSearch(R,n,key))!=-1)
printf("元素%d的位置是%d\n",key,i);
else
printf("元素%d不在表中\n",key);
}
注意定义low指针是从0开始还是从1开始(本实验从0开始)