顺序查找
int order_find(int* arr,size_t len,int key) // 会有非法值,因此不返回无符号;key为要找的值
{
for(int i = 0; i < len; i++)
{
if(arr[i] == key)
return i;
}
return -1;
}
二叉查找
递归算法
int _binary_find(int* arr,size_t l,size_t r,int key)
{
if(l > r) // 数列不有序,非法
{
return -1;
}
int pi = (l+r)/2; // 中间值
if(key > arr[pi]) // 值在右边,递归再次切分寻找
{
_binary_find(arr,pi+1,r,key);
}
else if(key < arr[pi]) // 若值在左边,同理
{
_binary_find(arr,l,pi-1,key);
}
else return pi; // 找到pi,返回其值
}
int binary_find(int* arr,size_t len,int key)
{
return _binary_find(arr,0,len-1,key);
}
循环算法
int binary_find2(int* arr,size_t len,int key)
{
int l = 0, r = len - 1;
while(l <= r)
{
int pi = (l+r)/2;
// 不断缩小查找范围
if(key > arr[pi])
{
l = pi+1;
}
else if(key < arr[pi])
{
r = pi-1;
}
else
{
return pi;
}
}
return -1; // 条件非法结束的
}