首页 > 其他分享 >(举例)在有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n)数组代码查找n

(举例)在有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n)数组代码查找n

时间:2022-12-19 11:31:26浏览次数:43  
标签:arr 下标 int mid 查找 数组

int binsearch(int x,int v[],int n)功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找n
以数组arr[]={1,2,3,4,5,6,7,8,9,10}为例

答案:

一.法一:从左到右挨个查找,找n次

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k;//用户输入将要查找的数字
int i=0;//数组的下标
int sz=sizeof(arr)/sizeof(arr[0]);//数组里的个数
printf("请输入要查找的数:");
scanf("%d",&k);
for(i=0;i<sz;i++)
{
if(k==arr[i])
{
printf("找到了,下标是:%d\n",i);
break;
}
}
if(i>=sz)
{

printf("找不到");
}
return 0;
}

1.对于从arr[]数组中查找一个数,首先我们需要明白代码需要用到的值有哪些:数组的存在;数组的个数;需要查找的数;数组的下标

注:这里数组的个数公式为:个数=总数组长度(所占空间)/单个数组数字的长度(所占空间)及sz=siezof(arr)/sizeof(arr[]);

注:数组下标为总数组个数减一,因为数组下标从0开始

2.使用scanf和printf是让用户从电脑中输入一个数k

3.要让k在数组里面进行查找,要分为两种情况:找得到和找不到

4.找得到:数组下标所对应的那个数值能与用户输入的k能对应起来,也就是说,如果数组中能找到与k一样的值,那么就靠的是数组的下标找到的。

也就是

if(k==arr[i])

如果反之,则找不到;

  if(i>=sz) 

对于要在其中寻找多次,进行循环,这里可以用到for的循环,从下标为0开始对数组进行查找比对

for(i=0;i<sz;i++)

方法一简单易懂 但过程较慢 对每次进行的查找都会进行n次

二.法二:二分法 找log2^n次

#include <stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k;
int sz=sizeof(arr)/sizeof(arr[0]);//计算元素个数
int left=0;//左下标
int right=sz-1;//右下标
printf("请输入要查找到数");
scanf("%d",&k);
while(left<=right)
{
int mid=(left+right)/2;
if(arr[mid]>k)
{
right=mid-1;
}
else if(arr[mid]<k)
{
left=mid+1;
}
else
{
printf("找到了,下标是:%d",mid);
break;
}
if(left>right)
{
printf("找不到");
}
return 0;
}
}

1.由于我们要使用二分法(简单来说 就是先确定一个中间点来判断我们所需要找的数字是在这个中间点的左边还是右边,以此类推多次查找就能缩小范围提高效率以达到目的),所以我们使用了left和right两个数组的下标作分别作为其左下标和右下标

2.要使循环能够进行 我们需要保证(left<right)恒成立,于是使循环条件为

while(left<=right)

3.为找到一个中间点 于是我们对下标进行了中间下标的算法,也就是找到这个值

    int mid=(left+right)/2;

4.之后,如果用户输出的一个数字比这个中间值mid小,则我们可以判断出这个用户需要查找的数字在mid的左边,这样就缩小了我们查找的范围,不需要在mid的右边进行查找了

5.找到之后,我们需要改变右下标的值,就是将mid的减一

right=mid-1;

6.在此后继续进行循环

7.如果在某一次循环中发现,用户所输入的值在mid的右边,则mid比所查找的值要小,这个时候就需要改变左下标,使循环不出错,也就是将mid+1

  left=mid+1;

8.最终就有可能找到这个数,而这个数的下标就是mid的下标所对应的

(注:这里的break是直接跳出这层循环,为确保不输出“找不到”,所以后文要用到if)

9.如果找不到这个,那么就会跳出循环

到最后一步

if(left>right)
{
printf("找不到");
}


标签:arr,下标,int,mid,查找,数组
From: https://blog.51cto.com/u_15899086/5951850

相关文章