排序的比较

BYR论坛上对排序的比较:
首先,快排不是最快的,它只是基于比较的排序算法中渐进时间复杂度最优的排序算法之一。

在数据量很小时,大家更倾向于用插入排序,因为实现简单,不需要递归,而且效率更高(实际上,c++ STL中的快排算法,当递归到元素个数小于K时,就不再递归而是调用插入排序)

对于不基于比较的排序,例如计数排序和桶排序等,都是复杂度O(n)的算法,当然更快了。

计数排序:它的复杂度为O(n+k)(其中k是整数的范围),快于任何比较排序算法。算法的步骤如下:
1、找出待排序的数组中最大和最小的元素
2、统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3、对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4、反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

桶排序:将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。
如要对大小为[1..1000]范围内的n个整数A[1..n]排序,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储(10..20]的整数,……集合B[i]存储((i-1)*10, i*10]的整数,i = 1,2,..100。总共有100个桶。然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。 然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。 

而且除了快,还要看其他的东西,例如是否是原地排序,递归深度,stability,并行性,locality,scalability,通信复杂度和实际要面临的数据的规律等等

在外存排序中,或者分布式环境下的排序,大家更倾向于用归并排序,因为实现简单,效率高(例如用mapreduce做),但是如果看过分布式的排序的论文的话,就会发现论文提出的非常快的算法很多还是基于快排的,不过做了很多改进,例如Histogram Sort,但这些都是要求MPI编程的

当然,还有针对专门的硬件设计的排序,例如基于Cell Processor的Cell Sort,号称在那上面比快排更快

以及基于排序网络的排序,例如bitonic sort(虽然对于大规模数据可以实际使用排序网络这玩意儿还没真正研发出来?),以及那些用来调情的排序,例如鸡尾酒排序,以及那些用来搞笑的排序,例如珠排序和stooge sort等。

1.稳定性比较

插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的
选择排序、希尔排序、快速排序、堆排序是不稳定的

2.时间复杂性比较

          平均情况        最好情况          最坏情况
归并排序     O(nlogn)     O(nlogn)          O(nlogn)
基数排序     O(n)         O(n)              O(n)
快速排序     O(nlogn)     O(nlogn)          O(n^2)
插入排序     O(n^2)       O(n)              O(n^2)
选择排序     O(n^2)       O(n^2)            O(n^2)

你可能感兴趣的:(小知识,排序算法)