族谱网 头条 人物百科

排序算法

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:261
转发:0
评论:0
分类在计算机科学所使用的排序算法通常被分类为:计算的时间复杂度(最差、平均、和最好性能),依据列表(list)的大小(n)。一般而言,好的性能是O(nlogn),且坏的性能是O(n)。对于一个排序理想的性能是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O(nlogn)。内存使用量(以及其他电脑资源的使用)稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。依据排序的方法:插入、交换、选择、合并等等。稳定性当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有:不稳定排序算法可能会在相等...

分类

在计算机科学所使用的排序算法通常被分类为:

计算的时间复杂度(最差、平均、和最好性能),依据列表(list)的大小( n )。一般而言,好的性能是O( n log n ),且坏的性能是O( n )。对于一个排序理想的性能是O( n )。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O( n log n )。

内存使用量(以及其他电脑资源的使用)

稳定性: 稳定排序算法 会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是 稳定 的,当有两个相等键值的纪录 R 和 S ,且在原本的列表中 R 出现在 S 之前,在排序过的列表中 R 也将会是在 S 之前。

依据排序的方法:插入、交换、选择、合并等等。

稳定性

当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。

在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有:

不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,(比如上面的比较中加入第二个标准:第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。

排序算法列表

在这个表格中, n 是要被排序的纪录数量以及 k 是不同键值的数量。

稳定的排序

冒泡排序(bubble sort)— O( n )

插入排序(insertion sort)—O( n )

鸡尾酒排序(cocktail sort)—O( n )

桶排序(bucket sort)—O( n );需要O( k )额外空间

计数排序(counting sort)—O( n + k );需要O( n + k )额外空间

归并排序(merge sort)—O( n log n );需要O( n )额外空间

原地归并排序— O( n log n )如果使用最佳的现在版本

二叉排序树排序(binary tree sort)— O( n log n )期望时间;O( n )最坏时间;需要O( n )额外空间

鸽巢排序(pigeonhole sort)—O( n + k );需要O( k )额外空间

基数排序(radix sort)—O( n · k );需要O( n )额外空间

侏儒排序 ( 英语 : Gnome sort ) (gnome sort)— O( n )

图书馆排序(library sort)— O( n log n )期望时间;O( n )最坏时间;需要(1+ε) n 额外空间

块排序 ( 英语 : Block sort ) (block sort)— O( n log n )

不稳定的排序

选择排序(selection sort)—O( n )

希尔排序(shell sort)—O( n log n )如果使用最佳的现在版本

Clover排序算法(Clover sort)—O(n)期望时间,O(n )最坏情况

梳排序— O( n log n )

堆排序(heap sort)—O( n log n )

平滑排序(smooth sort)— O( n log n )

快速排序(quick sort)—O( n log n )期望时间,O( n )最坏情况;对于大的、随机数列表一般相信是最快的已知排序

内省排序(introsort)—O( n log n )

耐心排序(patience sort)—O( n log n + k )最坏情况时间,需要额外的O( n + k )空间,也需要找到最长的递增子序列(longest increasing subsequence)

不实用的排序

Bogo排序— O( n × n !),最坏的情况下期望时间为无穷。

Stupid排序—O( n );递归版本需要O( n )额外内存

珠排序(bead sort)— O( n ) or O(√ n ),但需要特别的硬件

煎饼排序 ( 英语 : Pancake sorting ) —O( n ),但需要特别的硬件

臭皮匠排序(stooge sort)算法简单,但需要约n^2.7的时间

简要比较

均按从小到大排列

k代表数值中的"数位"个数

n代表数据规模

m代表数据的最大值减最小值

参考文献


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 算法
历史算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃拉托斯特尼筛法,线性方程组求解的算法。三国时代的刘徽给出求圆周率的算法:刘徽割圆术。自唐代以来,历代更有许多专门论述“算法”的专著:唐代:《一位算法》一卷,《算法》一卷;宋代:《算法绪论》一卷、《算法秘诀》一卷;最著名的是杨辉的《杨辉算法》;元代:《丁巨算法》;明代:程大位《算法统宗》清代:《开平算法》、《算法一得》、《算法全书》。而英文名称“Algorithm”来自于9世纪波斯数学家花拉子米(比阿勒·霍瓦里松,波斯语:خوارزمی‎,拉丁转写:al-Khwarizmi),因为比阿勒·霍瓦里松在数学上提出了算法这个概念。“算法”原为“algorism”,即“al-Khwarizmi”的音转,意思是“花拉子米”的运算法则,在18世...
· Paxos算法
问题和假设分布式系统中的节点通信存在两种模型:共享内存(Sharedmemory)和消息传递(Messagespassing)。基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复,在基础Paxos场景中,先不考虑可能出现消息篡改即拜占庭错误的情况。Paxos算法解决的问题是在一个可能发生上述异常的分布式系统中如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏决议的一致性。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就...
· CYK算法
相关参数定义G=(V,ΣΣ-->,S,P){\displaystyle~G=(V,\Sigma,S,P)}是一个上下文无关文法对于任意字符串w=σσ-->1...σσ-->n∈∈-->ΣΣ-->∗∗-->{\displaystylew=\sigma_{1}...\sigma_{n}\in\Sigma^{*}},定义w[i,j]=σσ-->i...σσ-->j,1≤≤-->i≤≤-->j≤≤-->n{\displaystylew[i,j]=\sigma_{i}...\sigma_{j},~1\leqi\leqj\leqn}对于任意选择的i,j{\displaystyle~i,j},定义Vi,j={X∈∈-->V|X⇒⇒-->∗∗-->w[i,j]}{\displaystyleV_{i,j}=\{X\inV~|...
· 双鱼算法
概要双鱼算法有128、192、256位三种密钥长度可供选择,块大小为128位,可以看作是布鲁斯·施奈尔1993年开发的Blowfish算法的延伸版本。技术上使用与Blowfish类似的计算方法,但是考虑到主要面向于网络应用,提高了更大密钥算法的速度。与Blowfish算法一样,双鱼算法无须授权即可使用。参考资料
· Kosaraju算法
简介该算法主要用于枚举图中每一个强连通分量内的所有顶点。该算法可由以下四部分组成:对有向图G{\displaystyleG}取逆,得到G{\displaystyleG}的反向图GR{\displaystyleG^{R}}利用深度优先搜索求出GR{\displaystyleG^{R}}的逆后排序对G{\displaystyleG}按照上述逆后排序的序列进行深度优先搜索同一个深度优先搜索递归子程序中访问的所有顶点都在同一个强连通分量内Java代码实现publicclassKosarajuAlgorithm{privateboolean[]marked;privateint[]id;privateintcount=-1;privateStackreversePostOrder;publicKosarajuAlgorithm(DigraphG){//G.V()返回有向图G的边数marked=new...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信