目录
题目:
有n个数存放在一个数组a[]中,输入一个数k,要求用折半查找求出k是数组中第几个元素的值,求该元素的下标;若k不属于数组中任何一个元素,则输出“None”。
方法一:不利用函数利用数组循环等求下标
#include<stdio.h>
int main()
{
int a[100], k, i, mid, n, flag = 0;
scanf("%d", &n);//输入数组的长度
int left = 0;//首元素下标
int right= n - 1;//末元素下标
for (i = 0; i < n; i++)
scanf("%d", &a[i]);//输入所有的数字
scanf("%d", &k);//输入要查找的数字
while (left <= right)//保证left <= right(下标)
{
mid = left + (right - left) / 2;//二分查找,求中间位置--注意溢出
//mid = (left + right)/2;//未考虑溢出情况
if (a[mid] == k)//先考虑相等的情况可以少比较两次
{
printf("%d\n", mid);//a[mid]=k,查找成功
flag = 1;//查找成功flag=1
break;
}
else
{
if (a[mid] < k)
left = mid + 1;
else
right = mid - 1;
}
}
if (flag == 0)//查找失败,flag仍为0(原来的数)
printf("None\n");
return 0;
}
先输入数组的长度(元素的个数)n,利用for循环语句随机输入n个数,再输入一个数k,若k在该数组中,在while循环语句中利用二分查找(折半查找)和if语句求元素k的下标,如果k不在该数组中,输出None,(利用flag判断k是否在该数组中)。
运行结果如下:
方法二:利用函数法求下标
#include<stdio.h>
int binary_search(int a[], int k, int n)
{
int left = 0;
int right = n - 1;
int flag = 0;
while (left <= right)
{
int mid = left + (right - left) / 2;//防溢出
//int mid = (left + right) / 2;
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else
{
printf("%d\n", mid);
flag = 1;//找到元素则flag=1
break;//然后结束该循环
}
}
if (flag == 0)//若输入的数k不在该数组中
printf("None\n");//则输出None
}
int main()
{
int a[100];
int k, s, i, n;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &k);//找到就返回找到位置的下标
//数组arr传参传递的只是数组首元素的地址
int ret = binary_search(a, k, n);
return 0;
}
调用函数binary_search求该下标,其他方法和方法一类似
其运行结果如下:
本来是利用调用函数方法求该下标的,后来在朋友的提醒下利用数组之前的知识求出随机值的下标,没学过函数的朋友们可以借鉴一下啦!有错误欢迎指出嘿嘿。