1.问题
在一个排好序的数组T[1…n]中查找x。若x在T中,则输出x的下标。若不存在,则输出-1.
2.解析
①遍历查找
通过遍历所有元素依次与target进行比较。
②二分查找
将被查找的键和子数组的中间键比较。如果被查找的键小于中间键,就在左子数组中继续查找,如果大于就在右子数组中继续查找,否则中间键就是我们要找的键。
3.设计
#include<stdio.h>
#define maxsize 1000
int search(int array[],int num,int target) //遍历查找
{
int i;
for(i=1;i<num;i++)
{
if(array[i]==target)
{
return i;
}
}
return -1;
}
int binary(int array[],int num,int target) //二分查找
{
int low=1,high=num;
while(low<=high)
{
int middle=(low+high)/2; //中间键
if(target>array[middle])
{
low=middle+1;
}
else if(target<array[middle])
{
high=middle-1;
}
else
{
return middle; //输出位置
}
}
return -1;
}
int main()
{
int num;
int array[maxsize];
int i;
int target;
printf("请输入数组的长度:\n");
scanf("%d",&num);
printf("请输入数组(从小到大):\n");
for(i=1;i<=num;i++)
{
scanf("%d",&array[i]);
}
printf("请输入查找的目标数字\n");
scanf("%d",&target);
printf("%d",binary(array,num,target));
}
4.分析
①遍历查找
时间复杂度:O(n)
②二分查找:总共有n个元素,
渐渐跟下去就是n,n/2,n/4,…n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O(h)=O(log2n)