【每日算法】排序算法总结(复杂度&稳定性)
一、插入排序:稳定,时间复杂度O(n^2)
想象你在打扑克牌,一開始左手是空的,接着右手開始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们须要从右到左将它与手中的牌比較,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。
详见: 插入排序
二、选择排序:不稳定,时间复杂度O(n^2)
每趟从未排序部分选出最小的元素。然后通过交换将其加入到已排序部分中。
详见: 选择排序
三、冒泡排序:稳定,时间复杂度O(n^2)
将待排序的元素看作是竖着排列的“气泡”。较小的元素比較轻。从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
假设发现两个相邻元素的顺序不正确。即“轻”的元素在以下,就交换它们的位置。显然。处理一遍之后,“最轻”的元素就浮到了最高位置;处理两遍之后。“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。
一般地。第i遍处理时,不必检查第i高位置以上的元素。由于经过前面i-1遍的处理,它们已正确地排好序。
详见: 冒泡排序
四、归并排序:稳定。时间复杂度 O(nlog n),空间O(n)
分解:将n个元素分成各含n/2个元素的子序列。
解决:用归并排序法对两个子序列递归地排序。
合并:合并两个已排序的子序列以得到排序结果。
合并思想:
桌面上有两堆已排好序的牌(比方最上面的牌最小),牌面朝上。
我们的任务是将两堆牌合并成一堆有序的牌。
以下開始取牌:从两堆牌顶上的两张牌中选取较小的一张,将其取出,面朝下放到输出堆中。假设重复取牌直到当中一堆牌为空,接下来仅仅要把剩下那堆牌(假设有的话)的全部牌都取出并放到输出堆中就可以。
详见: 归并排序
五、堆排序:不稳定,时间复杂度 O(nlog n)
堆排序是一种树形选择排序,在排序过程中。将A[n]看成是全然二叉树的顺序存储结构,利用全然二叉树中双亲结点和孩子结点之间的内在关系来选择最大的元素。
详见: 堆排序
六、高速排序:不稳定,时间复杂度 平均O(nlog n),最差O(n^2)。空间O(log n)->递归的栈空间
快排基于分治模式。其基本思想:
分解:从序列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,从而得到两个子序列。
解决:递归调用高速排序。对两个子序列进行排序。
合并:由于子序列是就地排序的,所以合并不须要不论什么操作。
详见: 高速排序
七、希尔排序:不稳定。时间复杂度 平均O(nlogn),最差O(n^s) 1 < s < 2
在直接插入排序算法中。每次插入一个数。使有序序列仅仅添加1个节点。而且对插入下一个数没有提供不论什么帮助。假设比較相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比較就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先取某个增量d,全部距离为d的倍数的记录放在同一个组中。先在各组内进行直接插入排序,然后再用一个较小的增量对它分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组。排序完毕。
八、计数排序:稳定,线性时间
计数排序假设n个输入元素都是0到k之间的整数,基本思想是对每一个元素x。确定出小于x的元素个数。之后便能够将x直接放到合适的位置。(需注意元素相等的情况)
详见: 计数排序
八、基数排序:稳定,线性时间
我们要对一副扑克牌排序,能够这样做:先无论牌的大小,先对花色(比方红桃、黑桃、方块、梅花)排序。之后再依据牌的大小排序。于是一副牌就按花色、大小排好了。
对于数字。我们能够先对最低位排序,再对次低位排序。。最后对最高位排序。
详见: 基数排序
八、桶排序:稳定。线性时间
假设全部元素均匀分布在区间[0,1)上,将该区间划分成n个同样大小的子区间(称为桶),之后。将相应的元素放到相应范围的桶里面,对各个桶里的元素进行排序,最后按次序把各个桶里的元素列出来就可以。
桶排序非常快。大多时候比快排还快。只是非常耗费空间。
详见: 桶排序
各个算法都有其适用的情况,所以没有绝对的优劣之分,详细问题要详细分析。
要是有人问你,哪个排序算法最好。千万别往坑里跳。o(^▽^)o
以下提一下一些有趣的排序:
(以下是并行化的排序算法)
奇偶排序(Odd-even Sort)
採样排序(Sample Sort)
每天进步一点点,Come on!
(●’◡’●)
本人水平有限,如文章内容有错漏之处,敬请各位读者指出,谢谢!
【每日算法】排序算法总结(复杂度&稳定性)的更多相关文章
- [数据结构与算法]排序算法(Python)
1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def inser ...
- 数据结构与算法---排序算法(Sort Algorithm)
排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进 ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- 常见排序算法总结与分析之交换排序与插入排序-C#实现
前言 每每遇到关于排序算法的问题总是不能很好的解决,对一些概念,思想以及具体实现的认识也是模棱两可.归根结底,还是掌握不够熟练.以前只是看别人写,看了就忘.现在打算自己写,写些自己的东西,做个总结.本 ...
- 经典排序算法(PHP)
1.冒泡算法,排序算法,由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序 function maopao_fun($array){ $count = count($arr ...
- C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素
01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...
- 排序算法大汇总 Java实现
一.插入类算法 排序算法的稳定性:两个大小相等的元素排序前后的相对位置不变.{31,32,2} 排序后{2,31,32},则称排序算法稳定 通用类: public class Common { pub ...
- python 排序算法总结及实例详解
python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...
- C++:主要几种排序算法及其复杂度
常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...
随机推荐
- springboot学习笔记(二)
首先我们来看一看,springboot启动类@RestController//@ResponseBody+@Controller@SpringBootApplicationpublic class H ...
- BZOJ3545 Peaks 离线处理+线段树合并
题意: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...
- [HNOI/AHOI2018]转盘(线段树优化单调)
gugu bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...
- Linux下启动tomcat报java.lang.OutOfMemoryError: PermGen space
一.错误信息 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke ...
- 搭建Samba共享服务器
[root@localhost ~]# yum -y install samba #安装Samba [root@localhost ~]# rpm -qa | grep samba ...
- centos6 磁盘与文件系统管理
一.磁盘管理 磁盘构成 1.圆形磁盘 2.磁盘读取头 3.机械手臂 4.主轴马达 运作原理 数据存储在具有磁性物质的圆形磁盘上,读写操作主要是通过机械手臂上的磁盘读取头来达成,实际运作时,主轴马达让磁 ...
- uva 10596 - Morning Walk
Problem H Morning Walk Time Limit 3 Seconds Kamal is a Motashota guy. He has got a new job in Chitta ...
- 正则表达式 整理(\w \s \d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $ \b 单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())
re.findall 匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表 一. 匹配单个字符 import re # \w 匹配所有字母.数字.下划线 re.find ...
- rbac组件之菜单操作(三)
菜单包括菜单列表,菜单列表不仅将菜单列出来,而且将每个菜单下的权限也列出来.菜单的添加.删除.修改. urls.py ... re_path(r'^menus/list/$', MenuView.as ...
- 关于OPENSSL的EVP函数的使用
4月份没什么做,就是做了OPENSSL的 加密和解密的应用,现在公开一下如何调用OPENSSL对字符串进行加密和解密,当中也学会了对加密数据进行BASE64编码,现在公开一下代码,在这感谢GITHUB ...