常见排序算法总结(实现原理,稳定度,使用场景,时间复杂度)
排序算法总结:实现原理,时间复杂度,使用场景,稳定度。
冒泡排序的实现原理:比较简单,不做叙述。
稳定性: 稳定
使用场景:适用于n较小的情况。
选择排序的实现原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
稳定性:不稳定。比如序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
使用场景:适用于n较小的情况。运行时间和输入无关。
插入排序的实现原理:
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
稳定性:稳定
最好情况:本就是有序序列。
使用场景:数据量小时使用。并且大部分已经被排序。
归并排序的实现原理:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
稳定性:稳定
使用场景:如果需要稳定,空间不是很重要,就选择归并排序。
快速排序的实现原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
稳定性:不稳定
最坏情况:
使用场景:是最快的通用排序算法,大多数使用情况下,是最佳选择。
堆排序:
堆排序稳定性
堆排序是不稳定的算法,它不满足稳定算法的定义。它在交换数据的时候,是比较父结点和子节点之间的数据,所以,即便是存在两个数值相等的兄弟节点,它们的相对顺序在排序也可能发生变化。
计数排序的实现原理:
稳定性:稳定
当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法
桶排序:
实现原理:它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
有些内容来自于其他人的博客,自己的纸质笔记。
常见排序算法总结(实现原理,稳定度,使用场景,时间复杂度)相关推荐
- 常见排序算法的最好、最坏、平均时间复杂度以及空间复杂度
文章目录 思考 前言 如何分析一个排序算法? 排序算法的执行效率 排序算法的内存消耗 排序算法的稳定性 如何选择合适的排序算法? 如何优化快速排序? 解答思考题 参考链接 思考 为什么插入排序比冒泡排 ...
- 常见排序算法的最好、最坏、平均时间复杂度、稳定性、是否基于比较
先看表格 分类 算法 时间复杂度 空间复杂度 稳定性 关联性 最好 最差 平均 插入排序 直接插 ...
- 常见排序算法的原理与实现(js)
常见排序算法通常需要通过比较来确定次序(比较类排序):由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 各类排序算法的特点: 术语解释: 时间复杂度:对排序数据的总的操作次数 ...
- ++代码实现 感知机的原理_常见排序算法原理及JS代码实现
来源:SegmentFault 思否社区 作者:Warren 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的理解说明,或许让你的困惑能得以解决(代码或说明若有问题,欢迎留言.联系 ...
- Java常见排序算法之插入排序
一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...
- python常见排序算法解析
python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...
- 十种常见排序算法欢聚一堂
文章目录 1.常见排序算法分类 2.非线性时间比较类排序 2.1 交换类排序 2.1.1 冒泡排序 2.1.2 快速排序 2.2 插入类排序 2.2.1 直接插入排序 2.2.2 Shell 排序 2 ...
- 【十种常见排序算法】
十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序 ...
- php常见排序算去,PHP兑现常见排序算法
PHP实现常见排序算法 //插入排序(一维数组) function insert_sort($arr){ $count = count($arr); for($i=1; $i $tmp = $arr[ ...
- Java常见排序算法
Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html
最新文章
- 服务器可以响应字符类型的数据吗,HTTP - Response
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
- python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...
- confluence 卡顿原因总结
- windows套接字IOCP模型
- oracle 根据spid查sql,探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句...
- 应用中心最佳实践之——使用应用组完成多集群一键部署
- Linux Shell脚本_历史命令显示操作时间
- pycharm在linux安装插件,Pycharm安装go插件,开始go之旅
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- “仿宋_GB2312、楷体_GB2312、方正小标宋简体”的下载和安装方式【实操】
- 基于SSM的毕业生就业管理系统设计与实现 Java mysql
- Linux debian解压和压缩.rar文件教程
- 用Python绘制当前日期
- java微信公众号开发一:服务器信息配置
- php 微信模拟登陆给用户发送消息(文字,图片,图文)
- 发现ramnit样本一枚
- 技术分享 | 使用 Zabbix + Grafana 搭建服务器监控系统
- Vue routers
- HTML辅助下载个人官网源码+UI非常不错
热门文章
- matplotlib可视化之饼图plt.pie()与plt.legend()中bbox_to_anchor参数的理解
- 12-属性动画源码分析
- Java 开发最容易写的 10 个bug
- kubernetes 与 rook 架构说明
- Android 手势操作GestureDetector
- nn.Upsample
- 【机器学习】贝叶斯分类三大实战项目:高斯模型进行疾病诊断、多项式模型进行文本分类、伯努利模型进行好/差评判别
- PS使得背景变成白色但是使得黑色字体颜色加深
- 遭遇裁员,如何渡过心理危机?
- 如皋中学2021高考成绩查询,喜报!如皋八所高中高考成绩公布