面试题:排序算法的稳定性?(文末有福利)
回归面试题!
回答重点
-
稳定的排序算法:冒泡排序、插入排序、归并排序、计数排序。
-
不稳定的排序算法:选择排序、快速排序、堆排序、希尔排序。
扩展知识
1)冒泡排序(Bubble Sort)
原理:
冒泡排序是一种简单的排序算法。它通过多次遍历数组,依次比较相邻的两个元素,如果前者比后者大,就交换它们的位置。这样,最大的元素会像气泡一样逐渐"冒泡"到数组的末尾。这个过程会重复多次,直到没有元素需要交换。
时间复杂度:
-
最优时间复杂度:O(n) (当数组已排序时)
-
平均时间复杂度:O(n²)
-
最坏时间复杂度:O(n²)
空间复杂度:
-
O(1) (原地排序)
特点:
-
稳定
-
简单易懂,但效率较低,不适合大数据量的排序。
2)插入排序(Insertion Sort)
原理:
插入排序通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。类似于打牌时整理手中的牌。
时间复杂度:
-
最优时间复杂度:O(n) (当数组已排序时)
-
平均时间复杂度:O(n²)
-
最坏时间复杂度:O(n²)
空间复杂度:
-
O(1) (原地排序)
特点:
-
稳定
-
对于小规模数据或基本有序的数据,效率较高。
3)选择排序(Selection Sort)
原理:
选择排序每次从未排序的序列中找到最小(或最大)的元素,放到已排序序列的末尾,直到所有元素排序完毕。
时间复杂度:
-
最优时间复杂度:O(n²)
-
平均时间复杂度:O(n²)
-
最坏时间复杂度:O(n²)
空间复杂度:
-
O(1) (原地排序)
特点:
-
不稳定
-
简单但效率低,通常不用于大规模数据排序。
4)快速排序(Quick Sort)
原理:
快速排序是一种分治算法。通过选择一个"基准"元素,将数组分为两部分,一部分比基准小,一部分比基准大。然后对这两部分分别进行递归排序。
时间复杂度:
-
最优时间复杂度:O(n log n)
-
平均时间复杂度:O(n log n)
-
最坏时间复杂度:O(n²) (当选的基准值不合适时)
空间复杂度:
-
O(log n) (递归栈的空间)
特点:
-
不稳定
-
是实际应用中最常用的排序算法之一,性能通常较好。
5)归并排序(Merge Sort)
原理:
归并排序是一种典型的分治算法。将数组分成两个子数组,对每个子数组分别排序,然后将排好序的子数组合并。
时间复杂度:
-
最优时间复杂度:O(n log n)
-
平均时间复杂度:O(n log n)
-
最坏时间复杂度:O(n log n)
空间复杂度:
-
O(n) (需要额外的数组存放合并结果)
特点:
-
稳定
-
适合处理大规模数据和链表排序,但空间开销较大。
6)堆排序(Heap Sort)
原理:
堆排序利用堆这种数据结构来排序。先将数组构建成最大堆,然后将堆顶元素(最大值)与堆的最后一个元素交换,减小堆的范围,并重新调整堆,直到排序完成。
时间复杂度:
-
最优时间复杂度:O(n log n)
-
平均时间复杂度:O(n log n)
-
最坏时间复杂度:O(n log n)
空间复杂度:
-
O(1) (原地排序)
特点:
-
不稳定
-
在实际中较少单独使用,常用于一些需要优先队列的场景。
7)希尔排序(Shell Sort)
原理:
希尔排序是插入排序的一种改进版。它通过设置一个初始的步长,将数组按步长分为多个子序列,对每个子序列进行插入排序,然后逐步缩小步长,直到步长为1。
时间复杂度:
-
最优时间复杂度:O(n log n)(根据步长序列的选择)
-
平均时间复杂度:O(n log² n)
-
最坏时间复杂度:O(n log² n)
空间复杂度:
-
O(1) (原地排序)
特点:
-
不稳定
-
相对简单,且在大多数实际情况下效率较高,但最坏情况难以分析。
8)计数排序(Counting Sort)
原理:
计数排序适用于数据范围有限的情况。通过计数数组记录每个元素出现的次数,然后根据计数数组构建排好序的数组。
时间复杂度:
-
最优时间复杂度:O(n + k)
-
平均时间复杂度:O(n + k)
-
最坏时间复杂度:O(n + k) (k为数据范围)
空间复杂度:
-
O(n + k) (需要额外的计数数组)
特点:
-
稳定
-
非比较排序,适用于范围较小的整数排序,空间复杂度较高。
福利:
私聊作者或者添加下方联系领取Java高频面试集pdf
相关文章:
面试题:排序算法的稳定性?(文末有福利)
回归面试题! 回答重点 稳定的排序算法:冒泡排序、插入排序、归并排序、计数排序。 不稳定的排序算法:选择排序、快速排序、堆排序、希尔排序。 扩展知识 1)冒泡排序(Bubble Sort) 原理: 冒…...
在Jdk1.8中Collectors和Comparator使用场景
在Jdk1.8中Collectors和Comparator使用场景 Collectors 和 Comparator 是 Java 8 引入的两个非常重要的类,它们在处理集合和流(Streams)时起着重要的作用。以下是这两个类的使用场景以及它们的典型用法。 1. Collectors Collector…...
linux-性能优化命令
top 我们先来说说top命令用法,这个命令对于我们监控linux性能是至关重要的,我们先来看看展示结果。 top - 15:20:23 up 10 min, 2 users, load average: 0.39, 0.53, 0.35 Tasks: 217 total, 1 running, 216 sleeping, 0 stopped, 0 zombie %C…...
基于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度呢
关于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度的问题,我们以启明智显 ZX7981P智能无线接入型路由器(CPE)挂广合通5G模组为例说明: 一般来说,用 ZX7981P,通过软加速,U…...
R包compareGroups详细用法
compareGroups compareGroups 是一个功能强大的 R 包,专为数据质量控制、数据探索和生成用于出版的单变量或双变量表格而设计。它能够创建各种格式的报表,如纯文本、HTML、LaTeX、PDF、Word 或 Excel 格式,并显示统计数据(均值、…...
如何选择高品质SD卡
如何选择高品质SD卡 SD卡(Secure Digital Memory Card)是一种广泛使用的存储器件,因其快速的数据传输速度、可热插拔的特性以及较大的存储容量,广泛应用于各种场景,例如在便携式设备如智能手机、平板电脑、运动相机等…...
C++学习:模拟priority_queue
一:仿函数 开始模拟前咱先了解一下仿函数。有了它,我们就可以自己传个代码让优先级队列升序还是降序,自己模拟时也不用在需要升序降序时改代码。这是个很有用的东西。 不写模版也可以,但模版能用在更多地方嘛 template <class …...
同程旅行对标拼多多:“形似神不似”
文:互联网江湖 作者:刘致呈 业绩好,并不意味着同程旅行就能高枕无忧了。 最近,媒体曝出:有用户在同程旅行APP上预订酒店,在预订成功并付款后,结果第二天却被酒店告知,没有查到相关…...
HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
https://console.cloud.tencent.com/ 腾讯云用户 登录控制台 右上角搜SSL 点击 SSL证书 进入链接 点申请 免费证书 有效期3个月 (以后每三个月申请一次证书 上传) 如果是腾讯云申请的域名 选 自动DNS验证 自动添加验证记录 如果是其他平台申请域…...
程序设计基础I-实验4 循环结构之for语句
7-1 sdut-C语言实验-AB for Input-Output Practice (Ⅳ) Your task is to Calculate a b. 输入格式: Your task is to Calculate a b. 输出格式: For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of out…...
深入工作流调度的内核
在大数据时代,工作流任务调度系统成为了数据处理和业务流程管理的核心组件,在大数据平台的构建和开发过程中尤为重要。随着数据量的激增和业务需求的多样化,合理的任务调度不仅能够提高资源利用率,还能保证业务流程的稳定和高效运…...
vue3中动态引入组件并渲染组件
在开发中 有时会在打包或者各种可能的情况下 报错或警告提示 模块化打包的问题, 我们需要动态引入组件并渲染组件时,可以使用import引入 如下举例 import { ref, markRaw } from vue const childrenComponent ref(); onMounted(() > {//举例引入一个…...
【艾思科蓝】网络安全的隐秘战场:构筑数字世界的铜墙铁壁
第七届人文教育与社会科学国际学术会议(ICHESS 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:https://ais.cn/u/nuyAF3 目录 引言 一、网络安全:数字时代的双刃剑 1.1 网络安全的定义与重要性 1.2 网络安全威胁的多元化…...
将图片资源保存到服务器的盘符中
服务类 系统盘符:file-path.disk(可能会变,配置配置文件dev中)文件根路径:file-path.root-path(可能会变,配置配置文件dev中)http协议的Nginx的映射前缀:PrefixConstant.…...
数学建模练习小题目
题目A 有三名商人各带一名仆人过河,船最多能载两人。在河的任何一岸,若仆人数超 过商人数,仆人会杀商人越货。如何乘船由商人决定,问是否有安全过河方案,若有,最少需要几步? 定义变量 商人和仆人的状态…...
不可错过的10款文件加密软件,企业电脑加密文件哪个软件好用
在信息安全日益重要的今天,企业和个人都需要可靠的文件加密软件来保护敏感数据。以下是2024年不可错过的10款文件加密软件,它们以强大的加密功能和易用性而闻名。 1.安秉加密软件 安秉加密软件是一款专为企业设计的信息安全管理工具,采用驱动…...
常用卫星学习
文章目录 Landsat-8 Landsat-8 由一台操作陆地成像仪 (OLI) 和一台热红外传感器 (TIRS)的卫星,OLI 提供 9 个波段,覆盖 0.43–2.29 μm 的波长,其中全色波段(一般指0.5μm到0.75μm左…...
音视频入门基础:FLV专题(3)——FLV header简介
一、引言 本文对FLV格式的FLV header进行简介,FLV文件的开头就是FLV header。 进行简介之前,请各位先从《音视频入门基础:FLV专题(1)——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和…...
python中数据处理库,机器学习库以及自动化与爬虫
Python 在数据处理、机器学习和自动化任务方面非常强大,它的库生态系统几乎涵盖了所有相关领域。我们将从以下几个部分来介绍 Python 中最常用的库: 数据处理库:Pandas、NumPy 等机器学习库:Scikit-learn、TensorFlow、Keras 等自…...
2024最新测评:低代码平台在企业复杂应用场景的适用性如何?
低代码平台种类多,不好一概而论。但最近有做部分低代码平台的测评,供大家参考。 一个月前接到老板紧急任务:调研有没有一款低代码平台能开发我司的软件场景。我司是一家快速发展中的制造业企业,业务遍布全国,需要一个…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
