二分查找思想:每次都与序列中间的元素进行比较,前提条件是数组是有序的,假设数组 array 为递增序列,key 为要查找的数,len为数组长度,首先将len个元素分成大致两部分,取 array[len/2] 与 key比较,如果相等,查找结束;如果 key < array[len/2],则只在数组左半部分查找,如果 key > array[len/2],则只在数组右半部分查找。
下面是递归法和非递归的两种实现方式:
/* 非递归法实现二分查找 */
//实现一个查找关键字在数组中的位置,并返回下标,如果不存在,返回-1
int getPosition(int *arr, int len, int key) //len:数组长度,key:待查找的关键字
{
int first=0, last=len-1;
while (1)
{
if (first<last)
{
if (key == arr[(first+last)/2])
{
return (first+last)/2;
}
else
{
if (key > arr[(first+last)/2]) first = (first+last)/2+1; //在后半部分查找
else last = (first+last)/2 - 1; //在前半部分查找
}
}
else
{
if (key == arr[first]) return first; //first等于last
return -1;
}
}
}
/* 递归法实现二分查找 */
int recursive_binsearch(int *arr, int key, int first, int last) //first:数组中的起始下标,last:数组中的尾数下标
{
assert(arr);
assert(first>=0 && last >=0 && first<=last);
int index;
index = (first+last)/2;
if (arr[index] == key) return index;
else if (arr[index] > key)
{
return recursive_binsearch(arr, key, first, index-1);
}
else
{
return recursive_binsearch(arr, key, index+1, last);
}
}