在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在
T的下标j;如果x不在T中,输出j=0。
一、顺序查找
顺序查找顾名思义就是按照顺序一个一个找。就好像拿到一刀试卷,你要从中找到自己的,那么你就要一张一张翻下去,直到找到自己的试卷。
在本题中,我们按照下标一个一个找。
代码:
void search(int x){
int j=0,i;
for(i=1;i<=n;i++){
if(T[i]==x){
j=i;
break;
}
}
printf("%d\n",j);
}
一共有一个for循环,是从1到n,所以顺序查找的时间复杂度是O(n)。
二、二分查找
二分查找又叫对分查找,就是把排好序(假设从小到大排好)的数组从中间对半分开,如果中间那个数小于我们要找的数,就在数组的前半部分再对半开,按照这个方法找。如果大于我们要找的数就在数组的后半部分对半分开进行查找。
代码:
void search(int x){
int low,mid,high,j=0;
low=1;
high=n;
while (low<high) {
mid=(low+high)/2;
if(T[mid]<x)
low=mid+1;
else if(T[mid]>x)
high=mid-1;
else if(T[mid]==x){
j=mid;
break;
}
}
printf("%d\n",j);
}
这个方法每次都取1/2。
从1/2到1/4到1/8……
所以时间复杂度为O(logn)。
代码放在GitHub上:GitHub地址
欢迎批评指正~