二分查找法是一种效率很高的查找算法,相对于普通遍历,二分查找法有着更低的算法时间复杂度。
现有一个有序数组
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
用二分查找的思想,取数组中的中间元素与要查找的元素作比较
数组要用下标查找其中的元素,所以先找到数组的左右下标
int left = 0;//左下标
int len = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
int right = len - 1;//右下标
找到左右下标后就可以找到数组中间值
int mid = (left + right) / 2;
找到中间值后要与要查找的元素作比较,这里要用到判断
if (num > arr[mid])
{
left = mid + 1;
}
上面这段代码的意思是:如果要查找的数大于数组的中间数,更新数组左下标
接着判断另一种情况,如果要查找的数小于数组的中间数,更新数组右下标
else if (num < arr[mid])
{
right = mid - 1;
}
判断完大于和小于,还剩最后一种情况就是等于,如果等于的话,直接输出就行
else
{
printf("找到了,下标为:%d\n", mid);
}
通过上面的这些操作,就完成了第一次二分查找
当然一次二分查找只能查找一次,所以要用到循环
由于二分查找一次就要更新一次左/右下标,循环条件就设置为当左下标小于等于右下标,这说明数组里还有数可查
while(left <= right)
{
int mid = (left + right) / 2;
if (num > arr[mid])
{
left = mid + 1;
}
else if (num < arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break;
}
}
这样就能循环查找数组中的元素,如果条件不成立,当左下标大于又下标时,就说明查找完了数组中的所有元素,数组里没有这个元素,就输出没找到
if (left > right)
{
printf("没找到\n");
}
完整代码为
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int num = 0;
scanf("%d", &num);//输入要查找的数字
int left = 0;//左下标
int len = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
int right = len - 1;//右下标
while(left <= right)
{
int mid = (left + right) / 2;
if (num > arr[mid])
{
left = mid + 1;
}
else if (num < arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break;
}
}
if (left > right)
{
printf("没找到\n");
}
return 0;
}