【每日算法】排序算法总结(复杂度&稳定性)
一、插入排序:稳定,时间复杂度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 ...
随机推荐
- Swift protocol extension method is called instead of method implemented in subclass
Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...
- createlang - 定义一种新的 PostgreSQL 过程语言
SYNOPSIS createlang [ connection-option...] langname [ dbname] createlang [ connection-option...] -- ...
- basename - 从文件名中剥离目录和后缀
总览 (SYNOPSIS) basename NAME [SUFFIX] basename OPTION 描述 (DESCRIPTION) 显示 去掉 目录成分 后的 NAME. 如果 指定了 SUF ...
- CAD使用GetAllAppName读所有名称(com接口)
主要用到函数说明: MxDrawEntity::GetAllAppName 得到所有扩展数据名称,详细说明如下: 参数 说明 [out, retval] IMxDrawResbuf** ppRet 返 ...
- eclipse中同步代码PULL报错checkout conflict with files的解决方法
1.Team--->Synchronize Workspace 2.在同步窗口找到冲突文件,把自己本地修改的复制出来 3.在文件上右键选择 Overwrite----->Yes , 4.再 ...
- OBJECTPROPERTY用法整理
OBJECTPROPERTY用法整理 分类: 系统表与表结构 数据库管理维护2010-06-03 16:37 2783人阅读 评论(1) 收藏 举报 数据库sql serverinsertobject ...
- 离线缓存 application cache
1. 什么是离线缓存: 离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 例子:比如我们在手机或电脑上访问一个 ...
- JAVA基础——设计模式之观察者模式
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- IDEA基本使用及配置(1)
前言:现在IDEA用的人很多,我以前都是用Eclipse的,都说这个IDE比较智能.好用,于是学习一下. IDEA与Eclipse目录结构对比: IDEA中的Project相当于Eclispe中的wo ...
- buf.equals()
buf.equals(otherBuffer) otherBuffer {Buffer} 返回:{Boolean} 返回一个 boolean 标识,无论 this 和 otherBuffer 是否具有 ...