初阶c语言(while循环二分法)
前言:
作业和那个不是一个级别的
内容:
3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)
下标就是数组的下标,从0开始,有点难度,我头有点晕,就是大概知道了,写代码也写不出来的那种,等我晚上在写
先看下问题代码,这已经是我边看边写的代码了,还出错误了
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
int right = sz -1;
int k = 7;
while(left >= right)
{
int mid = (left + right)/2;
if(arr[mid] > k)
{
left = mid + 1;
}
else if(arr[mid] < k)
{
right = mid -1;
}
else
{
printf("找到了,下标为:%d\n", mid);
}
}
return 0;
}
正确的值
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int sz = sizeof(arr)/sizeof(arr[0]); //计算元素个数
int right = sz -1; //计算右边的下标
int k = 7; //随机选择一个数,找出在数组是哪个下标
while(left <= right) //循环遍历,找出下标
{
int mid = (left + right)/2; //每次都需要重新计算,因为每次的left或right都会变
if(arr[mid] > k) //如果下标的值大于实际值,则右边偏移
{
right = mid - 1;
}
else if(arr[mid] < k)
{
left = mid +1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break; //找到值,需要跳出循环,不然mid值不变,会一直循环
}
}
return 0;
}