一、问题引入
在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种方法效率比较低, 比如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让 你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,比如:150,然后看大了还是小了,这就是⼆分查找,也叫折半查找。
二、遍历数组
例如有数组如图,用7与每个元素比较,一直找到相等的为止。 |
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i,x;
int sz;
int find = 0;//假设找不到为0
printf("intput:");
scanf("%d", &x);
sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
for (i = 0; i < sz; i++)
{
if (x == arr[i])
{
printf("下标为:%d\n", i);
find = 1;//找到为1
break;
}
}
if (find == 0)
{
printf("找不到对应的值");
}
return 0;
}
三、二分法
1、首先找到数组最中间的元素。用最左边的下标加最右边的下标除以二。
2、判断key与arr[mid]比较大小 (1)、如果key<arr[mid].则比较区间为light—(mid-1)。 (2)、如果key>arr[mid].则比较区间为 (mid+1)—right。 (3)、如果key=arr[mid].则找到了对应元素。 3、循环第二步,逐步缩小范围,即可找到对应元素。 |
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int x, sz;
int find = 0;//假设找不到为0
printf("intput:");
scanf("%d", &x);
sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
int light = arr[0];
int right = sz + 1;
int mid = 0;
while (light <= right)
{
int mid = (light + right) / 2;
if (x < arr[mid])
{
right = mid - 1;
}
else if (x > arr[mid])
{
light = mid + 1;
}
else if (x == arr[mid])
{
printf("找到了,下标为:%d", mid);
find = 1;
break;
}
}
if (find == 0)
{
printf("找不到");
}
return 0;
}
如果对你有帮助的话请点赞吧!
如有疑问请私信。