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

【数据结构和算法实践-排序-总结】

排序算法原理时间复杂度空间复杂度稳定性备注
冒泡排序通过重复遍历要排序的数列,比较相邻元素的值,若发现顺序错误则交换它们的位置,直到没有需要交换的元素为止,表示数列已经排序完成。平均和最坏情况:O(n^2)
最好情况:O(n)(已排序)
O(1)稳定简单的排序算法,适用于小规模数据。
选择排序遍历数组,每次从未排序的部分找到最小(或最大)的元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。平均、最好和最坏情况:O(n^2)O(1)不稳定易于实现,但效率较低。
插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。平均和最坏情况:O(n^2)
最好情况:O(n)(已排序)
O(1)稳定适用于部分有序的数据集。
希尔排序是插入排序的一种更高效的改进版本。希尔排序通过将原来要排序的数列分割成几个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。平均时间复杂度依赖于增量序列的选择,最坏情况:O(n^2)O(1)不稳定是一种分组插入方法。
归并排序采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。平均、最好和最坏情况:O(nlogn)O(n)稳定需要额外的存储空间来合并数组。
快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。平均情况:O(nlogn)
最坏情况:O(n^2)(已排序或逆序)
O(logn)(递归栈空间,最好情况)
O(n)(最坏情况)
不稳定实际应用中非常高效的排序算法。
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。平均、最好和最坏情况:O(nlogn)O(1)不稳定原地排序算法,不需要额外的存储空间。
计数排序是一种非比较型整数排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。O(n+k),其中k是整数的范围O(k)稳定适用于一定范围内的整数排序。
桶排序是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。平均时间复杂度依赖于数据的分布和桶的数量,最好情况:O(n+k),最坏情况:O(n^2)(极端不均匀分布)O(n+k)(桶和内部排序空间)稳定(桶内排序稳定)适用于数据分布均匀的情况。
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表示字符串(如日期或电话号码可以按位比较),所以基数排序也不是只能使用于整数。O(d(n+k)),其中d是最大数字的位数,k是数字的范围O(n+k)(计数数组或桶)稳定适用于整数排序,且数字位数不宜过长。

备注

  • 稳定性:如果两个相等的元素在排序前后的相对位置不变,则排序算法是稳定的;否则,排序算法是不稳定的。
  • 时间复杂度和空间复杂度:这些复杂度通常基于平均情况、最好情况和最坏情况来讨论。实际性能可能因具体实现和输入数据的特性而有所不同。
  • 引用来源:上述描述主要基于算法的基本概念和原理,同时参考了如百度百科等权威来源的描述。

http://www.kler.cn/news/325120.html

相关文章:

  • 9.24作业
  • Uniapp 打包后的横屏控制
  • 【JavaEE初阶】多线程7(面试要点)
  • MacOS安装MindSpore(2024年最新)
  • 创意实现!在uni-app小程序商品详情页轮播中嵌入视频播放功能
  • 成都睿明智科技有限公司可靠吗?
  • SpringBoot--为什么Controller是串行的?怎样才能并行?
  • uni-app之旅-day01-home页
  • Python 课程18-SQLAlchemy
  • Stable Diffusion绘画 | LCM模型:实现秒出图
  • 多旋翼无人机光伏发电站吊运技术详解
  • nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu
  • 19 vue3之自定义指令Directive按钮鉴权
  • Qt --- 其他控件的介绍 --- 多元素控件
  • 【在Linux世界中追寻伟大的One Piece】验证TCP
  • 数据工程师岗位常见面试问题-1(附回答)
  • yolo自动化项目实例解析(七)自建UI--工具栏选项
  • 【JavaEE初阶】深入解析单例模式中的饿汉模式,懒汉模式的实现以及线程安全问题
  • IDEA服务启动时无法输出日志
  • 用C++游戏开发
  • 【观察】华为:构筑先进AI存力底座,引领时代更创造时代
  • 企业如何提升知识产权管理效率?
  • linux StarRocks 安装
  • linux开启wol (网络唤醒)
  • MySQL Mail服务器集成:如何配置发送邮件?
  • 信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法
  • 华为OD机试 - 新学校选址(Python/JS/C/C++ 2024 E卷 100分)
  • 2024icpc(Ⅱ)网络赛补题E
  • C++(list的简单实现,着重点是迭代器)
  • navicat连接postgresql的ERROR: column datlastsysoid