1.二分查找的分析
对于查找,今晚上老范将了3中方法,
1.顺序查找(数组和链表),但是顺序表的效率不太稳定,不适合大数据,因为要找key值一般都是从遍历数组出发的,平均查找长度ASL=(1+n)/2,最坏时间的复杂度为O(n^2),对于这个我写过,就不写
2.二分查找,这是先一定要排好序才可以实现,先拿出中间的值a[mid]和key进行比较,比较之后又三种情况啊,相等,大于,小于。等于直接返回么,没有说的;如果大于的话,直接舍弃前一半,即就是下标low到mid的值,并重新赋值low=mid+1,这样大大的提高了查找的效率,这次可以选择递归和非递归实现,反正两个有共同的特点,结束条件,用非递归的话,只要low<=high就行了,用递归,它的结束条件是low比high大了,然后就返回去,其实递归也是我的硬伤,要好好的思考哩。对于这个时间的复杂度就为O(log2 n);
3.散列查找,这次不详细的说了,我会专门弄一个专题来大搞特稿的
2.二分查找的非递归代码
#include<stdio.h>
int halfsearch(int a[],int low,int high,int key) //非递归实现
{
int mid;
while(low<=high) // 结束条件是low>high
{
mid=(low+high)/2;
if(a[mid]==key)
return mid;
else if(a[mid]<key) //中间值比要查的值小
low=mid+1;
else
high=mid-1;
}
return -1; //如果没有找到,返回-1
}
int main()
{
int a[10]={1,5,9,15,22,27,33,44,68,97};
int low,high,key,mid;
low=0;
high=10-1;
printf("请你输入要查找的值: ");
scanf("%d",&key);
mid=halfsearch(a,low,high,key);
if(mid==-1)
{
printf("你的输入有误\n");
}
else
printf("你输入%d是第的位置是%d\n",key,mid+1);
return 0;
}
3.二分查找的递归代码
#include<stdio.h>
int halfsearch(int a[],int low,int high,int key) // 用递归实现
{
int mid;
if(low>high) //递归出口
return -1;
else
{
mid=(low+high)/2;
if(a[mid]==key) return mid;
else if(a[mid]<key)
return halfsearch(a,mid+1,high,key);
else
return halfsearch(a,low,mid-1,key);
}
}
int main()
{
int a[10]={1,5,9,15,22,27,33,44,68,97};
int low,high,key,mid;
low=0;
high=10-1;
printf("请你输入要查找的值: ");
scanf("%d",&key);
mid=halfsearch(a,low,high,key);
if(mid==-1)
{
printf("你的输入有误\n");
}
else
printf("你输入%d是第的位置是%d\n",key,mid+1);
return 0;
}
4.结果演示