过去几天我一直在尝试各种排序算法。从...开始 1)具有O(n ^ 2)时间复杂度排序的算法 2)O(n log n)时间复杂度到位和不合适的排序技术
我想知道是否有任何排序算法在线性时间或更短的时间内排序。我听说过基数排序,在最好的情况下接近线性时间排序,有一些空间复杂性。有人可以开导我吗?
答案 0 :(得分:3)
最快的一般排序是合并排序,它可以利用map / reduce模式(快速排序不能)
但是,如果您对数据有所了解,那么在某些情况下,数据集的排序速度可能会更快。
你不能比O(n)排序更快没有意义:你必须至少处理每个元素一次
回应你提到的基数类别:
(来自维基百科)
对于具有k个或更少位数的n个键,基数排序的效率为O(k·n)。有时k被表示为常数,这将使基数排序比基于最佳比较的排序算法更好(对于足够大的n),所有排序算法都是O(n·log(n))。但是,一般来说k不能算是常数。特别是,在所有键都是不同的共同(但有时是隐式)假设下,k必须至少是log(n)的顺序,导致没有比其他种类更好的结果。
答案 1 :(得分:2)
在线性时间运行的一些排序算法是计算排序,基数排序和存储桶排序。这些算法的问题在于它们需要对输入进行假设。计算排序和基数排序假设输入由小范围内的整数组成。存储桶排序假设输入是由随机过程生成的,该过程在一个间隔内均匀分布元素。 Page3-6,概述了上述算法。
答案 2 :(得分:2)
你不能排序小于O(N),因为你必须查看所有N个元素以确定列表是否已排序 - 所以那里的O(N)就在那里。如果通过与列表中的其他元素进行比较排序,您也无法比O(NlogN)排序更快 - 但如果您对数据有所了解,则可以。例如,如果您知道您的数据是英文字符串,那么您可以在排序之前将它们放入存储桶中。例如将所有以A开头的字符串放入一个桶中,将B放入另一个桶中,依此类推。这会很快。您可能需要使每个存储桶相当大 - 可能大到足以容纳1000个字符串,因为并非所有存储桶都包含相同数量的字符串。
然后对各个桶进行排序,这将很快。
对于统一的数据分布(即从每个字母开始的400个字符串,当然你不会有),我会猜测这将是O(N)+ O(Nlog N / M),其中M桶的数量。
显然你可以在第二个字母上嵌套存储桶,但是你拥有的存储桶越多,你的空间需求就越大,因为必须动态扩展存储桶会花费你的执行时间,所以你想让它们足够大到从...开始。这意味着它们中的许多将比它们需要的大得多,因为您不了解数据分布的所有内容。
图书馆排序也值得一看。
答案 3 :(得分:0)
如果您想了解对整数值最快的排序技术,那么我建议您参考以下链接: https://github.com/fenilgmehta/Fastest-Integer-Sort
它对大数组使用基数排序和计数排序,对小数组使用合并排序和插入排序。 据统计,这种排序算法比C ++ std :: sort的整数值要快得多。
对于“ int64_t array [10000000]”,它比C ++ STL std::sort
快6倍。
答案 4 :(得分:-2)
(编辑我之前的不良帖子,对不起所有人)
提高排序算法性能的一种方法是并行处理:
在这篇文章中,使用整数列表比较顺序和并行QuickSort算法的性能。双核机器的性能得到显着提升。根据这篇文章,QuickSort甚至可以在具有n个处理器的系统上以O(log n)执行:
http://en.wikipedia.org/wiki/Merge_sort#Parallel_processing
拥有众多核心可能听起来不真实,但是基础架构即服务(Amazon Cloud,Azure ......)它可以成为任务关键型实施的可用选项。