如何在一个有序数组中查找某一元素

简介: 如何在一个有序数组中查找某一元素

我们首先想到的可能就是遍历的方法了,那么使用遍历怎样来实现呢?

#include<stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};  //假设创建一个这样的数组
    int k = 7;  //假设要在数组中寻找数字7
    int i = 0;  //创建循环变量
    int flag = 0;  //创建一个变量来判断是否能找到,如果flag=1,则能找到,为0则找不到
    for(i=0;i<10;i++)  //循环进行十次
    {
        if(k == arr[i])  //进行判断
            {
                flag = 1;
                printf("找到了,下标是:%d\n",i);
                break;  //跳出循环
            }
    }
    if(flag == 0)
    {
        printf("找不到\n");
    }
    return 0;
}    

这种遍历的方式虽然简单,但是如果要寻找的数组元素比较多,那么这个代码将会进行很多次比较,不能够有效的提升代码运行速度,那么我们要怎样才能既实现找元素的功能,又不浪费太多时间呢?还有一种方法就是:折半查找法,也叫做二分查找法。二分查找法就是先将第一个元素的下标赋给left,最后一个元素的下标赋给right,然后它两相加除以2得到一个新的数值mid,将mid作为下标,然后用mid所对应的元素来与我们要查找的这个数作比较,如果要查找的这个数大于mid所对应的元素,那么就将mid+1赋给left;如果要查找的这个数小于mid所对应的元素,就将mid-1赋给right,然后继续该操作直到找到我们需要的数,打印出该数对应的下标,下面就用代码来实现

#include<stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int k = 7;
    int left = 0;  //数组第一个元素的下标为0
    int len = sizeof(arr)/sizeof(arr[0]);  
//求数组的长度,然后最后一个元素的下标就为len-1
    int right = len-1;
    int flag = 0;
    while(left<=right)  //这里用while循环简单一些
    {
        int mid = left+(right-left)/2;
//这样写可以防止left+right的值超过int或long long的范围,
//而且这里mid得定义在循环体的内部,如果在外部的话,
//left和right就一直是第一个元素的下标和最后一个元素的下标
        if(arr[mid]<k)
        {
            left = mid+1;
        }
        else if(arr[mid]>k)
        {
            right = mid-1;
        }
        else
        {
            flag = 1;
            printf("找到了,下标是:\n",mid);
            break;
        }
    }
    if(flag == 0)
    {
        printf("找不到\n");
    }
    return 0;
}

以上就是我对如何在一个有序数组中查找某一元素的看法,如果后续还有其他方法,我会继续对其补充。

相关文章
|
4月前
|
缓存
|
存储 缓存 算法
Flink RocksDB 状态后端参数调优实践
RocksDB 的配置也是极为复杂的,可调整的参数多达百个,没有放之四海而皆准的优化方案。如果仅考虑 Flink 状态存储这一方面,我们仍然可以总结出一些相对普适的优化思路。本文先介绍一些基础知识,再列举方法。
Flink RocksDB 状态后端参数调优实践
|
8月前
|
固态存储 安全 测试技术
别再用盗版镜像了!官方渠道获取Win10 ISO+VMware正版激活全流程
本文详细介绍了在VMware虚拟机上安装Windows 10系统的全流程,涵盖环境准备、虚拟机配置、系统安装及优化等关键步骤。内容包括软件资源获取(如VMware与Win10镜像下载链接)、硬件要求核查、虚拟机创建与参数设置(如UEFI/BIOS选择、处理器与内存分配),以及系统安装中的具体操作和常见问题解决方法。此外,还提供了性能调优方案(如显卡加速、快照管理)和高频问题解决方案,确保用户避开常见坑点。最后附有配套资源包和数据验证结果,帮助用户高效完成搭建并提升使用体验。
9827 17
|
缓存 编解码 安全
Android经典面试题之Glide的缓存大揭秘
Glide缓存机制包括内存和硬盘缓存。内存缓存使用弱引用的ActiveResources和LRU策略,硬盘缓存利用DiskLruCache。Engine.load方法首先尝试从内存和弱引用池加载,然后从LRU缓存中加载图片,增加引用计数并移出LRU。若缓存未命中,启动新任务或加入现有任务。内存大小根据设备内存动态计算,限制在0.4以下。DiskLruCache使用自定义读写锁,保证并发安全,写操作通过锁池管理,确保高效。
393 0
|
缓存 安全 数据安全/隐私保护
在实际应用中,如何根据具体场景选择合适的请求方法?
【10月更文挑战第29天】在实际应用中,需要综合考虑各种因素,如数据的性质、操作的语义、安全性要求、性能优化等,来选择最合适的 HTTP 请求方法。同时,还需要根据具体的业务逻辑和系统架构,对请求方法的使用进行合理的设计和规范,以确保系统的安全、稳定和高效运行。
|
存储
【头歌·计组·自己动手画CPU】五、单总线CPU设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】五、单总线CPU设计(理论版) 【计算机硬件系统设计】
2749 2
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之Managed Memory内存的含义是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
流计算 资源调度 Java
Flink on YARN(下):常见问题与排查思路
上篇分享了基于 FLIP-6 重构后的资源调度模型介绍 Flink on YARN 应用启动全流程,本文将根据社区大群反馈,解答客户端和 Flink Cluster 的常见问题,分享相关问题的排查思路。
Flink on YARN(下):常见问题与排查思路
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法
强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法