我经常发现自己处于需要对少量元素进行排序的情况。通过小,我的意思是3或4.我可能正确认为,对于这么小的问题集,我想要使用某种类型的显式或直接方法而不是调用sort函数。 2是微不足道的,3个元素仍然非常简单,但超过4项左右,我开始更喜欢只运行插入排序的简单性。
对于编码inline void sort_n(int *list)
,我可以期待多少元素? 4? 5? 6?
在本主题sorting int array with only 3 elements中,有两种解决方案可以对提供的3个元素进行排序。一个有更多的比较,而另一个最小化比较,但更复杂。在一个现代化的建筑上,它会出现在速度上吗?
答案 0 :(得分:6)
您个人资料您的应用程序是否已成为瓶颈?或者你想过度优化?
Bubblesort也可以很好地工作。特别是,当您的数据已经排序时,它实际上是最佳的,并将击败任何教科书合并或堆排序。除非你给出完全的约束(交换元素的成本,稳定性要求,就地与否......)没有人可以完全回答这个问题。
无论如何,对于四个元素,如何实现内联的有效合并排序是相当明显的。
对于奇数(2的非幂)大小,我相信向后插入排序是一种常见的优化。看看Javas排序实现。我相信它已经有如此小的阵列优化。您是否检查过您调用的排序例程是否尚未进行此类优化?
答案 1 :(得分:5)
看看排序网络。
一些链接:
http://en.wikipedia.org/wiki/Sorting_network
http://www.cs.uky.edu/~lewis/essays/algorithms/sortnets/sort-net.html
Fastest sort of fixed length 6 int array
答案 2 :(得分:4)
优化问题的所有答案必须以您应该分析并且仅优化瓶颈的警告开头,因此:确保这样做。
本着C / C ++的精神,我现在相信你这样做并回答你提出的问题。
通过迭代分析确定问题的答案。
编写template <int N> inline void sort_n(int * list)
,其默认实现使用std lib排序。在代码中适当时使用此模板。然后为最小的N个案例编写模板特化,而这个案例还没有专门化。编写此专业版后,请对您的程序进行概要分析,看看您是否取得了显着的性能提升。如果你获得了一个你认为重要的表现收益,那就重复一遍。一旦你写了一个专业化并且没有太多的东西,停止。
答案 3 :(得分:2)
对于任何合理数量的项目,您将始终通过明确编码比较获得性能优势。但是,对如此少的项目进行排序所花费的时间非常少,因此无论如何使用哪种方法都很少。
您将获得任何性能优势的阈值是当您获得的代码太多以至于它不再适合CPU缓存时,因此阈值将根据您运行它的CPU而有所不同
您还应该考虑如何测试此类代码。你拥有的代码越多,验证它没有bug就越难。
答案 4 :(得分:1)
您需要先对应用程序进行一些分析,以确定是否值得花时间进行此优化。我怀疑它不会。标准库(或增强)功能几乎肯定是您排序的最佳选择。
答案 5 :(得分:1)
插入排序和冒泡排序通常用于小数据。
我认为插入排序是首选,引用这两个维基百科文本:
快速排序实现对小于某个阈值的数组使用插入排序
和
冒泡排序也与现代CPU硬件交互不良。它需要至少两倍于插入排序的写入次数,两倍的高速缓存未命中次数,以及渐进式更多的分支错误预测。 Astrachan在Java中排序字符串的实验显示,冒泡排序大约比插入排序慢5倍,比选择排序慢40%。
与往常一样,如果你真的关心速度,你应该描述一下。
答案 6 :(得分:0)
我被告知标准库排序已针对小n
优化了案例 - 我从未尝试过验证它。