使用二分查找前提
数组是已经按照顺序或者倒序排列好的并且没有重复元素。
思路
1.数组下表区间【0,size-1】,size-1是因为数组下表是从0开始,第一位是1-1,所以末位是size -1;
2.现要在数组里查询的值记为input,取数组下表中间值,我们记为middle,middle对应的数组值记为arr[middle];
3.当arr【middle】> input,说明 input所对应的下标在middle的左边,所以我们现在要更新搜索区间,即左边0不变,右边变为middle -1;-1是因为arr【middle】本来就和input不相等,所以取前一位;
4.当arr[middle] < input,说明 input所对应的下标在middle的右边,所以我们现在要更新搜索区间,即右边保持不变,左边变为middle+1;+1是因为arr【middle】本来就和input不相等,所以取后一位;
5.循环,直到查到为止,查不到即返回-1.
代码实现
#include<stdio.h>
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int input = 0;
scanf("%d",&input);
int size = sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right = size - 1;
while(left <= right){
int middle = (left + right)/2;
if(arr[middle] < input){
left = middle + 1;
}else if(arr[middle] > input){
right = middle - 1;
}else{
printf("找到下标:%d",middle);
return middle;
}
}
return -1;
}
补充第二种方法:
#include<stdio.h>
int digui(int left,int right,int arr[],int a){
int middle = (left+right)/2;
if(left <= right){
if(arr[middle] < a){
left = middle + 1;
return digui(left,right,arr,a);
}else if(arr[middle] > a){
right = middle -1;
return digui(left,right,arr,a);
}else if(arr[middle] = a){
return middle;
}
}
return -1;
}
int main(){
int a = 0;
int arr[10] = {11,22,33,44,55,66,77,88,99,110};
scanf("%d",&a);
int left = 0;
int right = sizeof(arr)/sizeof(arr[0]) - 1;
int b = digui(left,right,arr,a);
printf("返回下标: %d",b);
return 0;
}