在一个有序数组中查找元素,找到了就返回下标,没有找到就提示没有找到。
1.常规遍历查找
附带源码大家可以体验效果。
int main()
{
int len[10] = {1,2,3,4,5,6,7,8,9,10 };
int input = 0;
printf("请输入你要查找的数字:\n");
scanf("%d", &input);
int i = 0;
for (i = 0; i < 10; i++)
{
if (input == len[i])
{
printf("找到了,下标是%d\n", i);
break;
}
}
return 0;
}
2.二分查找(折半查找)
为什么要引入这个算法。我们思考一下,如果要查找的数据基数很大呢,比如我们要在一万个数据的基础上去查找的话,是不是就得遍历一万次最坏的情况。
二分查找的思想,对于有序数列,我都可以预先找到它的中间值,左边的数据要么比他大要么都比它小,右边的数据要么都比它小要么都比它大。那么我要查找一个数,只用把这个数和中值做比较,如果要查找的数大于或者小于中间值,是不是就相当于消去了一半的数据。
让我们用图解理解一下。
附上源码大家可以体验效果。
int main()
{
int len[] = { 1,2,3,4,5,6,7,8,9,10 };
int right = sizeof(len)/sizeof(len[0]) - 1;
int left = 0;
int mid = 0;
int key = 0;
printf("请输入要查找的数字:\n");
scanf("%d", &key);
while (left <= right)
{
mid = (left + right) / 2;//这里不能使用int mid = ....这样就会把mid定义为局部变量。
if (len[mid] > key)
{
right = mid - 1;
}
else if (len[mid] < key)
{
left = mid + 1;
}
else
{
break;//两个值相等
}
}
if (left <= right)
{
printf("找到了,下标是%d\n", mid);
}
else
{
printf("找不到\n");
}
return 0;
}
以上就是今天分享的内容,期待大家的多多指正。