首页 > 其他分享 >利用折半查找法去找一个有序数组中你要找的数并输出

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

时间:2023-01-09 19:31:26浏览次数:35  
标签:折半 right 法去 int mid flag 查找 数组 left

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

#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;
}

运行结果

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

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

标签:折半,right,法去,int,mid,flag,查找,数组,left
From: https://blog.51cto.com/u_15838996/5998755

相关文章

  • 顺序查找-1
    #region自组织查找///<summary>//////</summary>///<paramname="arr"></param>///<paramname="sValue"></param>///<returns></returns>publicstaticint......
  • Sed 查找某一行,并替换这行内容
    Sed中/c是替换的意思,可以用这个/c来实现查找并替换一整行的需求。比如查找iburst所在的行,并把这行内容替换成自己希望的内容。[root@ceph01~]#more/etc/chrony......
  • pta 6-5 折半插入排序
    将这一组数据分为有序组(有颜色的)和无序组(没有颜色的),数据的第一个元素默认为有序,如下:   将无序组中1号位置的数据进行拷贝,同时将1号位置收编到有序组序列中。此处将......
  • C#二分查找
    输入一个数字,并在有序数列1~10中查找该数字,输出其下标#include<stdio.h>intmain(){intk=0;intleft=0,right=0,mid=0;inti=0;intarr[]={1,2,3......
  • 二分查找进阶版
    一、题目时间限制:500ms空间限制:64MB很久以前,有位同学,在学完算法课的二分后,激动的振臂高呼:“我学会二分了!”。此时,一位学长从旁边经过听到此话,决定出一道题考考他,挫挫同学的......
  • SQL209 查找employees表emp_no与last_name的员工信息
    SQL209查找employees表emp_no与last_name的员工信息题目有一个员工表employees,请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆......
  • VBA查找、匹配函数 Find 、Match
      Range.Find方法(Excel) 表达式.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)特别重要的......
  • 二分查找
    一、二分查找核心1)二分查找的原理二分查找(Binarysearch)也称折半查找,是一种效率较高的查找方法。 设置查找区间:low=0;high=n;若low>high时仍未找到,则查找失败;否......
  • 算法—查找三数相加为零的三元组
    packagealgorithm;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b......
  • 查找所有树的直径都经过的边的数量
    P3304目录大体思路code此题思路上跟https://www.cnblogs.com/kingbuffalo/p/17027323.html上的思路差不多。目录大体思路第一遍dfs找到最远点第二遍dfs找到直......