在一个顺序的数组中,查找一个数字的下标,如果用遍历的方法查找,将会耗费更多的时间。采用二分法能更有效率的查找出目标数字。
它的原理是,用要查找的数字k和数组的中间值作比较,一次能去掉一般的可能性。经过反复比较,很快能找到目标数字。
int main()
{
int arr[]= { 0,1.2,3, 4, 5, 6, 7, 8, 9, 10 };
int left = 0;
int right = 9;
int k = 1;
while(k>0&&k<10)
{
int mid = (left + right) / 2;
if (mid > k)
{
right = mid - 1;
}
else if (mid < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d", mid-1);
return 0;
}
}
printf("没找到");
return 0;
}
这个代码能够实现功能,但又存在这明显的缺陷。如果将输入的数组改变,那后面的程序也要跟着调整,很是麻烦,经过查找参考之后,代码进行了优化。
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 5;//要查找的数字
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
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", mid);
break;
}
}
if (left > right)
{
printf("找不到了\n");
}
return 0;
}
这个时候可以发现,就算是改变了数组内容,代码依然能够实现功能,不用修改。