当前位置: 首页 > news >正文

如何快速判断数组是否已排序?3种方法带你轻松搞定!

今天来聊聊一个很基础但很重要的面试题:如何判断一个数组是否已经按升序排列?

问题描述

给定一个数组arr[],判断它是否按升序排列。允许数组中有相等的元素,连续相等的元素视为有序的。

示例:

  • 输入:arr[] = [10, 20, 30, 40, 50]→ 输出:true(已排序)
  • 输入:arr[] = [90, 80, 100, 70, 40, 30]→ 输出:false(未排序)

方法一:迭代法(推荐)

这是最直接、最高效的方法。我们只需要遍历数组一次,检查每个元素是否大于或等于前一个元素。如果发现前一个元素大于当前元素,立刻返回false

思路解析:

以数组[10, 20, 30, 5, 6]为例:

  • i = 1:10 <= 20 ✅
  • i = 2:20 <= 30 ✅
  • i = 3:30 > 5 ❌ 返回 false

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

代码实现(C++):

#include<iostream>#include<vector>usingnamespacestd;boolisSorted(vector<int>&arr){for(inti=1;i<arr.size();i++)if(arr[i-1]>arr[i])returnfalse;returntrue;}intmain(){vector<int>arr={10,20,30,40,50};cout<<(isSorted(arr)?"true\n":"false\n");return0;}

Python 实现:

defisSorted(arr):n=len(arr)foriinrange(1,n):ifarr[i-1]>arr[i]:returnFalsereturnTrueif__name__=="__main__":arr=[10,20,30,40,50]print("true"ifisSorted(arr)else"false")

Java 实现:

classGFG{staticbooleanisSorted(intarr[]){intn=arr.length;for(inti=1;i<n;i++)if(arr[i-1]>arr[i])returnfalse;returntrue;}publicstaticvoidmain(String[]args){intarr[]={10,20,30,40,50};System.out.print(isSorted(arr)?"true\n":"false\n");}}

刚看完这3种判断数组排序的方法,是不是觉得光靠文字理解算法还是有点抽象?别急,这里安利一个宝藏工具——图码。它把60+种数据结构和算法做成交互式动画,能直观看到每一步操作。更绝的是,你还能输入自定义数据或上传C/C++/Java/Python代码,瞬间生成专属可视化动画。无论是备战408考研、数据结构期末考试,还是刷算法面试题,图码都能帮你把抽象逻辑变得一目了然,还支持24小时AI代码解析。快去试试,学习效率直接拉满。

图码-数据结构与算法交互式可视化平台
访问网站:https://totuma.cn

方法二:递归法

递归方法的核心思想是:检查最后两个元素是否有序,然后递归地检查剩余部分。

步骤:

  1. 如果数组大小为0或1,直接返回true(空数组或单元素数组总是有序的)。
  2. 检查最后两个元素是否满足arr[n-1] >= arr[n-2]
  3. 如果满足,递归调用检查前 n-1 个元素。

复杂度分析:

C++ 实现:

#include<iostream>#include<vector>usingnamespacestd;boolisSortedHelper(vector<int>&arr,intn){if(n==0||n==1)returntrue;returnarr[n-1]>=arr[n-2]&&isSortedHelper(arr,n-1);}boolisSorted(vector<int>&arr){returnisSortedHelper(arr,arr.size());}intmain(){vector<int>arr={10,20,30,40,50};cout<<(isSorted(arr)?"true\n":"false\n");return0;}

Python 实现:

defisSortedhelper(arr,n):ifn==0orn==1:returnTruereturnarr[n-1]>=arr[n-2]andisSortedhelper(arr,n-1)defisSorted(arr):n=len(arr)returnisSortedhelper(arr,n)if__name__=="__main__":arr=[10,20,30,40,50]print("true"ifisSorted(arr)else"false")

方法三:使用内置函数(仅限C++和Python)

这个方法最简单,但只适用于支持相关内置函数的语言。

C++ 使用is_sorted()

#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;boolisSorted(vector<int>&arr){returnis_sorted(arr.begin(),arr.end());}intmain(){vector<int>arr={10,20,30,40,50};cout<<(isSorted(arr)?"true\n":"false\n");return0;}

Python 使用sorted()

defis_sorted(arr):returnarr==sorted(arr)if__name__=="__main__":arr=[10,20,30,40,50]print("true"ifis_sorted(arr)else"false")

总结

方法时间复杂度空间复杂度适用场景
迭代法O(n)O(1)最推荐,高效且简单
递归法O(n)O(n)适合练习递归思想
内置函数O(n)O(1)代码最简洁,但依赖语言特性

推荐:在实际开发或面试中,迭代法是最优选择——时间复杂度低、空间复杂度低、代码清晰易懂。

如果对你有帮助,记得点赞收藏哦!

http://www.cnnetsun.cn/news/2181039.html

相关文章:

  • 别再花钱算命了!实测用ChatGPT和Kimi免费算八字,手把手教你如何提问更准
  • UE4开发避坑指南:别再乱用同步加载了,这些异步加载场景能显著提升游戏流畅度
  • 机器学习参数化与非参数化算法对比与应用
  • 2026年5月阿里云部署OpenClaw/Hermes Agent详解+百炼token Plan速成攻略
  • WarcraftHelper完整指南:5大核心功能解决魔兽争霸III现代系统兼容性问题
  • 基于神经网络的银行票据真伪鉴别系统开发实践
  • ArUco二维码在ROS机器人导航中的应用:从单目相机标定到实际定位避坑指南
  • MCP 2026沙箱隔离机制重大升级:5类高危场景下必须立即执行的4项配置校准
  • 掌握AI专著撰写技巧,借助AI工具快速产出20万字高质量专著!
  • 别再只看数据表了!PCB板材Dk/Df实测,这几种IPC标准方法到底怎么选?
  • DistilBart模型在企业级文本摘要中的实践与优化
  • 避开这些坑,你的PMSM无感观测器仿真才能收敛:Simulink模型搭建的实用避坑指南
  • 别再只用RGB看图了!手把手教你用Python处理Sentinel-2 L2A的12个波段(附代码)
  • 对比直接使用厂商 API 体验 Taotoken 在模型切换便利性上的优势
  • 别再死记硬背了!用Java Swing从零撸一个贪吃蛇,彻底搞懂GUI事件监听
  • 市面上主流的PLC品牌介绍+描述
  • 高效掌握Google OR-Tools:从基础到实战的完整优化指南
  • 思源宋体TTF:7款免费中文宋体字体完整使用指南
  • 避坑指南:全志F1C200S Melis2.0系统烧录、调屏与固件修改常见问题排查
  • 多轮对话红队攻击技术解析与DIALTREE框架实践
  • CodeVault:为AI编程助手构建持久记忆,提升开发效率
  • GitHub趋势发现利器:基于增长算法的开源项目挖掘工具
  • 3步完成抖音评论自动化采集:零代码解决方案的实用指南
  • YOLOv8目标跟踪实战:用ByteTrack和Bot-SORT跑通你的第一个视频(附常见报错解决方案)
  • RoboMaster飞镖供电实战:用ESP32C3+I2C驯服IP5306的‘臭脾气’(附完整代码)
  • 从Telnetlib到Netmiko:一个网络工程师的Python自动化升级之路(避坑指南)
  • 从SyncNet到高清Wav2Lip:保姆级配置与训练全流程(含GAN调优指南)
  • 京东抢购助手:5步实现秒杀自动化,告别手速焦虑
  • 别再死磕渲染参数了!3dMax 2024 + Vray 6.2 手把手教你做出电影级体积光(附PS后期调色技巧)
  • 5步掌握Silk v3音频转换:轻松解决微信QQ语音播放难题