二分查找必须是有顺序的序列(序列从大到小或从小到大)
二分查找思想:一段有序序列,取中间值(a[(i+j)/2])和要查找的值比较(假设序列为升序),如果中间值小于要查找的值,则取中间值右侧一段的中间值在进行比较,直到找到或遍历结束为止。
如图找24
顺序查找与二分查找比较运行时间代码
#include<stdio.h>
#include<time.h>//clock函数头文件
#include<stdlib.h>//strand,rand函数头文件
inta[1000000];//用于存储有序的数字的数组
doubleshunxu(int a[],int num,int n)//顺序查找函数
{
clock_t beg,end;//起始时间和结束时间
double time;//顺序查找运行时间
int i;
beg=clock();//起始时间
for(i=0;i<n;i++)//循环从第一个数开始比较
{
if(a[i]==num)//相等则找到待查数
{
printf("顺序查找找到指定数据%d\n",a[i]);
break; //跳出循环,不在进行查找
}
}
if(i==n)
{
printf("顺序查找未找到指定数据\n");
}
end=clock();//结束时间
time=(double)(end- beg) / CLOCKS_PER_SEC;//顺序查找运行时间
return time;
}
doubleerfen(int a[],int num,int n)//二分查找函数
{
clock_t beg,end;//同上
double time;
int low=0,mid,high=n-1;//low为数组第一个数下标,mid为中间数下标,high为最后一个数下标
beg=clock();//起始时间
while(low<=high)//进行循环low>high时数组遍历完成
{
mid=(low+high)/2;//求出新的中间数的下标
if(a[mid]<num)//当中间数小于待查数,待查数在中间数右面
{
low=mid+1;//将中间数下一个的下角标赋值给low
}
else if(a[mid]>num)//当中间数大于待查数,待查数在中间数左面
{
high=mid-1;//将中间数前一个的下角标赋值给high
}
else
{
printf("二分查找找到指定数据:%d\n",a[mid]);//中间值为待查值
break;
}
}
if(low>high)
{
printf("二分查找未找到指定数据\n");
}
end=clock();//结束时间
time=(double)(end- beg) / CLOCKS_PER_SEC;//运行时间
return time;
}
intmain()
{
int n,m,num,i;
printf("请输入数字个数:");
scanf("%d",&n); //n为数组数字个数
for(i=0;i<n;i++)//生成从小到大的有序数组
{
a[i]=i;
}
srand(time(NULL));
m=n-n/10+1;
num=rand()%m+(n/10);//随机生成一个待查数
printf("随机数为:%d\n",num);
printf("顺序查找运行时间为:%f\n",shunxu(a,num,n));
printf("二分查找运行时间为:%f\n",erfen(a,num,n));
return 0;
}