上面我们介绍了顺序查找,但是它的时间复杂度为o(n)让人很受伤啊,所以有了二分查找,二分查找是一个时间复杂度为O(logn)的算法,当然都是说的一般情况下,二分、二分,看名字就知道它的核心是什么了,就是不断地额逼近查找值。
代码
#include<stdio.h>
#define max_len 20
typedef struct
{
int r[max_len+1];
int length;
}seq;
int search(seq sq,int k)
{
int low,high,mid;
low=1;
high=sq.length;
while(low<=high)
{
mid=(low+high)/2;
if(sq.r[mid]<k)
low=mid+1;
else if(sq.r[mid]>k)
high=mid-1;
else break;
}
if(low>high)
return 0;
else return mid;
}
int main()
{
seq sq;
int value,k,i,len;
printf("input length:");scanf("%d",&len);
sq.length=len;
printf("input values:\n");
for(i=1;i<=len;i++)
{
scanf("%d",&sq.r[i]);
}
printf("I need find:");scanf("%d",&value);
k=search(sq,value);
if(k)
printf("the value(%d) location:%d",value,k);
else printf("NOT find");
return 0;
}
总结
相对于顺序查找是快了不少,但是要是想要删除或者添加点东西就有些麻烦了,所以就有了下一篇二叉排序树。