二分查找算法(C语言)
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。-----360百科
下面是代码,不过只能返回在排序后序列中的位置,并不能返回在输入序列中的位置,就简化为查看输入数据中是否存在。
#include<stdio.h>
#define N 1000
void sort(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}/*由于此算法是基于有序表的,所以需要先对输入的数据
排序,这里使用冒泡排序法对数据进行升序排序。*/
int search(int a[],int num,int n)
{
int result=-1;//设置返回值
int left,right,middle;
left=0;
right=n-1;//设定查找范围,即下标
while(left<=right)//结束标志:左端下标大于右端下标
{
middle=(left+right)/2;//先比较中间的数与给定的数
if(a[middle]==num)
{
result=middle;
break;
}//若中间的数正好与给定数相等,就结束循环
else if(a[middle]>num)
right=middle-1;/*若中间的数大于给定的数,则说
明给定的数在排序后表的左端,查找范围就变成表的左端,即右端点变为中间端点*/
else if(a[middle]<num)
left=middle+1;
}//与上面相反
return result;//返回在排序后序列里的序号
}
int main()
{
int a[N],n,x,i,result;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
sort(a,n);
result=search(a,x,n);
if(result==-1)
printf("未找到该数。");
else
printf("找到该数。");//简化后的输出
return 0;
}
二分查找算法的时间复杂度为O(log₂n).