二分查找的对象必须是有序的数组,因此在进行查找之前必须对数组进行排序;二分查找的思想是就是折半思想,给定待查找的元素,左边界下标left,右边界下标,以及中间下边
;对于一组升序 的数组进行查找时,
,这时比较中见下标元素值和待查找元素下标值,如果待查找值比中间下标值大,则更新
;
;比中间下标元素值小则更新
,
; 需要注意两种情况:
(1) 当到查找的值 比该数组元素 都小,最后 ,
,因此此时输出
始终为0;
(2) 当到查找的值 比该数组元素 都大,最后 ,
,因此此时输出
始终为
;
二分查找具体代码如下:
#include <stdio.h>
#define N 10
int main()
{
int arr[N] = {1,2,3,4,5,6,7,8,9,10};
int left = 0; //左边界
int right = N-1; // 右边界
int mididx; // 折半下标
int idx = -1; // 输出下标
int findData = 10; // 待查找元素
while(left <= right)
{
mididx = (left + right)/2;
if(findData == arr[mididx])
{
idx = mididx; //找到对应的元素 记录下标
break;
}
else if (findData > arr[mididx])
left = mididx + 1; //更新左边界
else
right = mididx -1; //更新右边界
}
if (idx==-1)
{
printf("none !\n"); // 没有查找到
}
else
printf("indec=%d\n",idx); // 查找成功
return 0;
}
冲时间复杂度上看,二分查找的时间复杂度为:。
模板函数写法
函数模版:
template<typename T>
int binary_search (T arr[], int size, T target) ;
参数说明:
T: 模版参数
arr : 数组首地址,
size: 数组元素个数,
T target : 需要查找的值
返回值: 如果数组中找到target, 返回其下标;否则返回 -1;要求数组元素顺序非递减
template<typename T> // T: 模版参数
int binary_search (T arr[], int size, T target) //size:数组元素个数,T target:需要查找的值
{ // arr:数组首地址,
int position; //返回查找元素的下标
T data; // 待查找的元素的对象
int bottom = 0; // 左边界
int top = size - 1; //右边界
while (bottom < top) {
int mid = (bottom + top) / 2; // 折半
data = arr[mid];
if (data < target)
bottom = mid + 1;
else
top = mid;
}
if (top < bottom)
return -1;
else {
position = bottom;
data = arr[bottom];
if (data == target)
return position;
else
return -1;
}
}