时间复杂度
二分查找的时间复杂度为O(logn),查找的每次都需要折半,就是/2,每次都将要查找的数据范围缩小一半,从1到1/2再到1/4,1/8直到中间的数字就是我们要找的数字。
代码
int a[10] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};//有序数组
int left = 0;//先定一个左界,从数组第一个数开始
int right = sizeof(a) / sizeof(a[0]) - 1;//右界,数组长度-1,数组最后一个数
int key = 19;//需要查找的数字
int mid = 0;//当前的中间数
while (left <= right)
{
mid = (left + right)/2;
if (key == a[mid])
{
break;
}
else if (key > a[mid])
{
left = mid + 1;
}
else if (key < a[mid])
{
right = mid - 1;
}
}
printf("%d ", a[mid]);
细节
left <= right,==(等于号)==考虑下面这种情况:
有一个数组下标从0到10,共计11个数据,要查找的数据正好下标为10。
第一次折半:left = 0;mid = 5;right = 10
第二次折半:left = 6;mid = 8;right = 10
第三次折半:left = 9;mid = 9;right = 10
第四次折半:left = 10;mid = 10;right = 10(此时left+right是偶数,mid找到了我们想要的数,并且left == right)
如果我们要找的数据在第一个呢?
第一次折半:left = 0;mid = 5;right = 10
第二次折半:left = 0;mid = 2;right = 4
第三次折半:left = 0;mid = 0;right = 1
(此时left+right是奇数,left没有等于right时,mid就已经给出了结果,由于/的特性)