原理:对有序的数据定一个开始查找的初始位置,一个结束位置,在取他们的中间数,然后拿需要查找的数和这个中间数比较,在根据比较结果在划定查找初始位置,或者结束位置,在重新计算中间数,知道查找位置等于结束位置还没出现需要查找的数,那就说明数据集合中没有要查找的数。
比如一个数组有1到9
1 2 3 4 5 6 7 8 9
查找8。
查找的初始位置是1下标就是[0],结束位置是9,下标是[8],中间数就是([0]+[8])/ 2 = [4],下标是[4],也就是5
先拿8和中间数5比较,如果比5大,就可以排除掉小于5的所有情况,于是可以把查找的初始位置划分到5前面一个元素,也就是下标[4+1] = [5],数是6的位置。
这样就成了,
6 7 8 9
中查找是否存在8,查找初始位置是[5],结束位置是[9],中间数就是([5]+[8])/ 2 = [6],也就是7
然后8和7比还是更大,这样就要继续往后划分,查找初始就划分到就划分到[7+1] = [7],那么就正好是8。那就查找到了,这组数据中有8。
循环实现
// math数据集合,size数组大小,data要查询是否存在的数据
int binary_Search(int math[], int size, int data) {
int up = 0;
int down = size-1;
int centre = 0;
while (up <= down)
{
centre = (up + down) / 2;
if (data > math[centre]) {
up = centre + 1;
}else if (data < math[centre]) {
down = centre - 1;
}
else {
return centre;
}
}
return -1;
}
递归实现
// math数据集合,up查找的开始,down查找的边界,data需要查找的数据
int binary_Search_2(int math[], int up, int down, int data) {
if (up >= down) {
return -1;
}
int centre = (up + down) / 2;
if (data > math[centre]) {
return binary_Search_2(math, centre + 1,down, data);
}
else if (data < math[centre]) {
return binary_Search_2(math, up, centre - 1, data);
}
else {
return centre;
}
}