从事实时计算多年,熟悉jstorm/spark/flink/kafka/rocketMq, 热衷于开源,希望在这里和前辈们一起学习与分享,得到长足的进步!邮箱:hustfxj@gmail.com 我的githup地址是:https://github.com/hustfxj。欢迎和大家一起交流探讨问题。
分类: 高性能计算
2013-10-27 21:54:03
注意: 快速排序是排序大数组的最常用算法
排序算法
平均时间
最差时间
稳定度
额外空间
备注说明
冒泡排序
O(n2)
O(n2)
稳定
O(1)
n小时较好
选择排序
O(n2)
O(n2)
不稳定
O(1)
n小时较好
插入排序
O(n2)
O(n2)
稳定
O(1)
n小时较好
归并排序
O(nlogn)
O(nlogn)
稳定
O(n)
n大时较好
快速排序
O(nlogn)
O(n2)
不稳定
O(logn)
n大时较好
堆排序
O(nlogn)
O(nlogn)
不稳定
O(1)
n大时较好
计数排序
O(n)
O(n)
稳定
O(n+k)
输入序列限制
基数排序
O(n)
O(n)
稳定
O(n+k)
输入序列限制
桶排序
O(n)
O(n)
稳定
O(n)
输入序列限制
下表是各个排序算法的比较说明
是一个对少量元素进行排序的有效算法。实现比较简单。时间复杂度:O(n^2),空间复杂度:O(1)。是稳定的排序方法。
点击(此处)折叠或打开
点击(此处)折叠或打开
//合并排序
每一趟都比较相邻两个元素,若是逆序的,则交换。结束的条件应该是“在一趟排序过程中没有进行过交换元素的操作”。时间复杂度:O(n^2),空间复杂度O(1)。是稳定的排序。
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
算法思想
基数排序是从低位到高位依次对所有的数进行排序。如果所有的数最高位数是d,那么先按最低有效位数字进行排序,得到一个结果。然后往高位重复这个过程。需要注意的是,按位排序必须是稳定的排序算法。经常采用的是计数排序。
点击(此处)折叠或打开
当输入数据符合均匀分布时,即可以以线性期望时间运行。即使输入不满足线性关系,桶排序也仍然可以以线性时间运行。只要输入满足这样一个性质,即各个桶尺寸的平方和与总的元素数呈线性关系。
点击(此处)折叠或打开
合并排序
采用分治法。将n个元素分成各含n/2个元素的子序列,用合并排序法对两个子序列递归的排序(子序列长度为1时递归结束),最后合并两个已排序的子序列得到结果。时间复杂度:O(nlogn),空间复杂度:O(n)。是稳定的排序方法。
冒泡排序
快速排序
它是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序元素分成两个部分,其中一部分元素比另一部分元素小。再分别对这两部分元素进行排序。以达到整个元素序列有序。时间复杂度:O(nlogn),空间复杂度O(logn),是不稳定的算法。
堆排序:
一种原地排序算法,即在任何时刻数组中只有常数个元素存储在输入数组以外
计数排序
思想是对每一个输入元素x,确定出小于x的元素的个数。然后我们就可以直接把它放在嘴中输出数组中相应的位置上。 但是计数排序基于这样一个假设:n个输入元素的每一个大小范围都是[0,k]。
时间复杂度是O(k + n)。一般,当k = O(n)时,常常采用计数排序。这时候的运行时间为O(n)。计数排序是稳定的排序。
基数排序
桶排序
桶排序的思想:
将区间[0,1)分成n个相同大小的子区间,或称为桶。然后将n个输入元素分布到各个桶中去。每个桶中的元素用一个链表来存储