二分查找/折半查找(此方法仅用于顺序排列)
该算法是高效的找出数字方法
假设n个数 次数=log2n 如找2的32次个数,只需要32次
步骤:
1.设 left=初始位底数(0),right=最后一位底数,mid=(left+right)/2
2.不断的通过折半,来比较与想要找的数字(k)
3.如果a[mid]>k,则mid显然在k的左边,left=mid+1; 如果a[mid]<k,则mid显然在k的右边,right=mid-1;
反复重复1,2,3步骤,当a[mid]=k,则找到数字k,即输出mid底数
如a[10]={1,2,3,4,5,6,7,8,9,10} 找到数组中的一个数,输出它的底数
如找数字7,输出显示底数6
left=0,right=9,mid=(left+right)/2=4,此时a[mid]=5<7,left=mid+1=5
left=5,right=9,mid=(left+right)/2=7,此时a[mid]=8>7,right=mid-1=7
left=5,right=7,mid=(left+right)/2=6,此时a[mid]=7=7,输出mid
如果用正常的找法,从第一位开始找的话,需要7次才能找到,大大的降低了效率
#define _CRT_SECURE_NO_WARNINGS 1
int main(){
int a[10] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printf("请输入你想要的数字:");
int k;
scanf("%d",&k);//输入你想要的数字
int left = 0;
int right = 9;
while (left <= right){
//比较左右大小来得到想要数字的底数
int mid = (left + right) / 2;
if (a[mid] < k){
left = mid + 1;
}
else if (a[mid]>k){
right = mid - 1;
}
else{
printf("它的底数是:%d\n", mid);
break;
}
}
if (left > right){
printf("找不到奥!\n");
}
return 0;
}