利用折半查找法去找一个有序数组中你要找的数并输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用折半查找法去找一个有序数组中你要找的数并输出相关的知识,希望对你有一定的参考价值。
从一个数组中寻找你要找的数并输出角标其中一种解决方法便是遍历数组找到你要的那个数。
#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;
运行结果
以上是关于利用折半查找法去找一个有序数组中你要找的数并输出的主要内容,如果未能解决你的问题,请参考以下文章
有15个数存放在一个数组中,输入一个数,要求用折半法找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。