二分查找和普通查找(C语言)
问题
写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。
解析
想要从一个已经有序的数组,我们想要快速的找到其中特定值的所在位置,我们首先会想到普通的暴力遍历,优化一点的话,就会想到二分查找
普通查找
我们只需要从左往右依次遍历数组,和要查找的值进行比较,如果相同的话就返回下标
核心代码为:
void stupid(int a[],int num){
int flag = 0;
printf("stupid\n");
for (int i = 0; i <10; ++i) {
if (a[i]==num){
printf("j = %d\n",i+1);
flag = 1;
}
}
if (flag==0){
printf("%d\n",0);
}
}
二分查找
我们先设定一个中间值,中间值等于最左边值+最右边值的和/2,用输入的数字与中间值进行大小比较,若数组为升序排序的话,如果中间位置对应的值比输入的值大的话,就更新front为中间位置+1,然后跟新中间位置值,若输入值比中间值小则反之
核心代码:
void binarySearch(int a[],int num){
printf("binarySearch\n");
int front = 0,end = 9;
int mid = (front+end)/2;
while (front<end){
if (a[mid]==num){
break;
} else if(a[mid]<num){
front = mid+1;
} else{
end = mid-1;
}
mid = (front+end)/2;
}
if (a[mid]==num){
printf("j = %d\n",mid+1);
} else{
printf("j = %d\n",0);
}
}
复杂度
- 普通查找:O(N)
- 二分查找:O(logN)