折半查找由于其实现原理所限制,因此使用它必须保证要查找的数据是有序的
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAX 100
struct slist
{
int a[MAX];
int len;
};
//折半查找 传 顺序表指针 要查找的元素
// 返回值 -1 查找失败
//按照从小到大 写的
int search(struct slist *s,int key)
{
//头 中间 末尾
int low=0,mid,high=s->len-1;
//开始循环查找
while(low<=high)
{
// 取中间元素
mid=(low+high)/2;
//中间元素 s->a[mid]
//如果是从大到小的顺序表那就将大于号改为小于号
//其实根本的思想就是动两个未知变量来锁定方位而已
//如果刚好找到了就直接返回
if(s->a[mid]==key)
{
return mid;
}
//如果中间值大于要找的值
else if(s->a[mid]>key) //去mid前面查找
{
high=mid-1;
}
//如果中间值小于要找的值
else
{
low=mid+1;
}
}
return -1;//查找失败
}
void main()
{
int i,key,k;
struct slist s;
s.len=0;
for(i=0;i<10;i++)
{
printf("请输入第%d个元素:",s.len+1);
scanf("%d",&s.a[s.len]);
s.len++;
//++s.len;
}
printf("请输入要查找的元素:");
scanf("%d",&key);
k=search(&s,key);
if(k==-1)
{
printf("查找失败\n");
}
else
{
printf("查找成功,位置是%d\n",k+1);
}
}