描述
在一个升序的数组查找指定的数字n
方法1:遍历法
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int key = 0;//要找的数
int flag = 0;
//最后一个元素的下标
int sz = sizeof(arr) / sizeof(arr[0]) - 1;
int count = 0;
printf("请输入要找的数:");
scanf("%d", &key);
for (i = 0; i <= sz; i++)
{
count++;
if (arr[i] == key)
{
flag = 1;
printf("你要找的数是:%d\t下标为:%d\n", arr[i], i);
break;
}
}
if (flag != 1)
{
printf("找不到你想要的数\n");
}
printf("总共找了%d次\n", count);
return 0;
}
运行结果
方法2:二分查找法
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;//最后一个元素的下标
int mid = 0;//记录中间元素的下标
int key = 0;//你想找到数
int flag = 0;
int count = 0;
printf("请输入要找的数:");
scanf("%d", &key);
while (left <= right)
{
count++;
//mid = (left + right) / 2;//中间元素的下标
mid = left + (right - left) / 2;//优化写法
if (key > arr[mid])
{
left = mid + 1;
}
else if (key < arr[mid])
{
right = mid - 1;
}
else
{
flag = 1;
printf("你要找的数是:%d\t下标为:%d\n", arr[mid], mid);
break;
}
}
if (flag != 1)
{
printf("找不到你想要的数\n");
}
printf("总共找了%d次\n", count);
return 0;
}
值得注意的是上述代码中的第20行。
在计算中间元素的下标时并不是直接用左下标加上右下标后除以2,而是用左下标+左右下标差值的一半。
如果left和right的值非常大的时候,left+right的值有可能会超出int的最大范围,从而导致一些问题。但是在这种优化的方法中只要right的值不超出范围就行。