二分查找的步骤
(1) 假定这里有一个升序的数组,那么首先要确定查找区间的中间位置,即mid=left+(right-left)/2;
(2) 将待查找值与中间位置的值进行比较,如果两个值相等,说明已找到,则返回下标;
(3) 若大于中间位置的值,将在后半区域中继续折半查找;
(4) 若小于中间位置的值,将在前半区域中继续折半查找;
(5) 查找成功,则返回数值的数组下标。
理解二分查找其实很容易,但在C语言中,由于数组的下标是从0开始的,导致二分查找算法中出现了多个变量,这就要求在编程的过程中具体数值和下标都要把控好。
打个不是特别恰当的比方,在现实生活中二分查找就是一元函数,而到了C语言中二分查找就是二元函数,有多个变量要去把控。
上代码。详细说明都在注释中
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//sizeof(arr)是求arr这个数组有多少字节的
//sizeof(arr[0])则是求下标为0的那个成员有多少字节
//前者除以后者就是数组成员的数量
int left = 0;
int right = sz - 1;
//这里的left和right都是下标的值,所以left是0,right减去1
int k = 6;
//以查找6的下标为例
while (left <=right)
{
int mid = left + (right - left) / 2;
//确定中间位置的下标
if (k > arr[mid])
{
left = mid + 1;
//由于要查找的数大于中间位置的值,这里重新定义left
}
else if(k<arr[mid])
{
right = mid - 1;
//由于要查找的数小于中间位置的值,这里重新定义right
}
else
{
printf("下标为%d\n",mid);
//这是left和right相等的情况
break;
//直到left和right相等,终止循环。若不终止,会造成死循环
}
}
if (left > right)
{
printf("没有找到下标");
//这是没有找到下标的情况
}
return 0;
}
如有错误或需要补充,欢迎与博主联系和探讨。