一、二分查找原理
二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是通过比较数组中间元素和目标值的大小关系,来确定目标值在数组的哪一部分,然后不断缩小查找范围直到找到目标值或者确定目标值不存在为止。
注:查找数组必须是有序数组
二、算法实现流程
三、代码示例
int binary_search(int *arr,int size,int target)
{
int low = 0; /*定义最低下标为记录首位*/
int high = size - 1; /*定义最高下标为记录末位*/
while(low <= high)
{
int mid = (low + high) / 2; /*折半*/
if(arr[mid] == target) /*若相等,这说明mid为查找到的位置*/
{
return mid;
}
else if(arr[mid] > target) /*若查找值比中值小,最高位下标调整到中位下标小一位*/
{
high = mid - 1;
}
else{ /*若查找值比中值大,最低位下标调整到中位下标大一位*/
low = mid + 1;
}
}
return -1; /*如果上述循环结束后,没有找到指定值,返回-1*/
}
int main()
{
int arr[] = {1,10,20,25,36,41,50,56,60};
int size = sizeof(arr) / sizeof(int);
int ret = binary_search(arr,size,56);
printf("ret === %d\n",ret);
return 0;
}
运行结果:找到56的下标为7
四、复杂度分析
1、时间复杂度
最好情况:目标元素正好位于数组的中间,时间复杂度为O(1)。
平均情况和最坏情况:二分查找每次都将查找范围减半,因此时间复杂度为O(log n)。
2、空间复杂度
迭代版本:空间复杂度为O(1)。
递归版本:空间复杂度为O(log n),这是因为递归调用栈的深度。
二分查找算法特别适用于大数据集,因为它能够迅速排除掉大量的元素,使得查找过程非常高效。然而,它要求输入数组必须是有序的,否则算法将无法正常工作。