利用折半查找法去找一个有序数组中你要找的数并输出

时间:2023-01-09 20:00:27

从一个数组中寻找你要找的数并输出角标其中一种解决方法便是遍历数组找到你要的那个数。

#include<stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 },flag=0;
int sz = sizeof(a) / sizeof(a[0]);//这一步的目的就是求出这个数组的长度。
int b,d=0;
scanf("%d", &b);
for (int i = 0; i <= sz; i++)
{
if (a[i] == b)
{
flag = 1;
d = i;
printf("找到了角标是%d", d);
break;
}
}
if (flag == 0)
{
printf("没有找到");
}
return 0;
}

而折半查找法就是找到最左边(对应角标值为0)和最右边的角标(对应的角标值为数组长度-1)将两者的角标相加除以2得到中间角标然后运用中间角标的数组值与要查找的数比较大小.。然后不断的进行这一过程若要找的数存在于数组中那便一定会找到。(这个方法只适用于有序数组)

#include<stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(a) / sizeof(a[0]);
int k,j=0;
scanf("%d", &k);//k表示要查找的值
int right = sz - 1;//求出最右边的角标值
int left = 0;//求出最左边的角标值
int flag = 0;
for (left = 0, right = sz - 1; left <= right;)
{
int mid = left + (right - left) / 2;//这里不用(left+right)/2是因为若这个数组很大那么left和right在之后也会很大那么很可能会超过整形的储存大小导致部分数据丢失那mid就不是中间值了这个的语句的意思就是用大的数据减去小的数据得到了两者数据的差值之后将差值除以2再与小的值相加也能得到中间值
if (a[mid] < k)
{
left = mid + 1;//这里的目的是提前一位因为if条件这个代表所选值大于中间值那么中间值不为要找的值要找的值又比它大故加一下面原理相同
}
else if (a[mid]>k)
{
right = mid - 1;
}
else
{
flag = 1;
j = mid;
printf("找到了角标是%d\n", j);
break;
}
}
if (flag == 0)//flag的值只有在循环中出现数组的值与k相同才会改变flag的值
{
printf("没有找到\n");
}


return 0;
}

运行结果

利用折半查找法去找一个有序数组中你要找的数并输出

利用折半查找法去找一个有序数组中你要找的数并输出