vector<pair<int,float>>
进行排序,其中的pair需要按照float值进行排序。这个vector的长度在0到5之间。我已经在Google上搜索并阅读了有关C ++排序方法的内容,但找不到任何针对小数据集的基准测试。对于系统来说,尽可能快速非常重要,因为它用于实时斑点跟踪系统。此致, Pollux
vector<pair<int,float>>
进行排序,其中的pair需要按照float值进行排序。这个vector的长度在0到5之间。我已经在Google上搜索并阅读了有关C ++排序方法的内容,但找不到任何针对小数据集的基准测试。对于系统来说,尽可能快速非常重要,因为它用于实时斑点跟踪系统。另一种选择是硬编码比较逻辑,使用一些if
语句。
可以查看如何以最快的方式对一个由7个整数组成的数组进行排序?获取一些想法。
阅读基准测试的内容毫无意义。你可以阅读并比较算法的复杂度(Big-O),因为它只取决于算法本身,但基准测试取决于太多因素。
你需要使用你所用的工具,在对应用户应用的环境中进行基准测试。
您需要对这段代码进行优化的特定原因是什么?对于n==5,几乎任何排序算法都可以。甚至Bogosort也应该有合理的运行时间,因为数据中只有 5! == 120 种可能的排列方式。您是否分析了您的算法以找出其中的瓶颈?
d_sort.h
的文件缺失,我猜它是和那本书一起提供的。其次,我有一个单轴递归快速排序比std::sort快得多。此外,有一个双轴快速排序(不是我创建的)击败了我的快速排序和std::sort。话虽如此,std::sort还是相当快的,但是对于研究需要保持警惕并仔细审查它们以了解它们的执行方式。 - Justin Peel如果你确信(也就是说,你已经进行了测量),这是一个瓶颈并且需要优化,而STL中的任何排序算法都不够快(你也已经测量过了),那么也许你知道更多可以使用的东西?标准排序算法是通用的,并且适用于任何数据集:不同数量的元素,不同范围的值等等。如果你真的需要性能,诀窍通常是使用额外的信息来制定更专业的算法。
在这里,你已经说了一件事情:有0-5个元素需要排序,正如Nick D在他的回答中所说,也许使用硬编码的if语句而不是通用排序算法的循环或递归可能会更快。
但也许还有更多?例如,浮点值是否有任何限制?
这里有一个排序4个元素的例程,使用最优数量的比较。我本来想发布5个元素的,但stackoverflow限制帖子长度为30000个字符。
实际上这是否是最快的取决于你的CPU指令缓存能承受多少压力,所以在真实程序中进行基准测试!
/// Generated sort function for 4 arguments.
template <class T>
void DirectSort(T& a0, T& a1, T& a2, T& a3) {
if (a0 < a1) {
if (a0 < a2) {
if (a0 < a3) {
if (a1 < a2) {
if (a1 < a3) {
if (a3 < a2) {
{
T tmp(a2);
a2 = a3;
a3 = tmp;
}
}
}
else { // a1 >= a3
{
T tmp(a1);
a1 = a3;
a3 = a2;
a2 = tmp;
}
// a2 >= a3
}
}
else { // a1 >= a2
if (a1 < a3) {
{
T tmp(a1);
a1 = a2;
a2 = tmp;
}
// a2 < a3
}
else { // a1 >= a3
if (a2 < a3) {
{
T tmp(a1);
a1 = a2;
a2 = a3;
a3 = tmp;
}
}
else { // a2 >= a3
{
T tmp(a1);
a1 = a3;
a3 = tmp;
}
}
}
}
}
else { // a0 >= a3
if (a1 < a2) {
{
T tmp(a0);
a0 = a3;
a3 = a2;
a2 = a1;
a1 = tmp;
}
// a1 >= a3
// a2 >= a3
}
else { // a1 >= a2
{
T tmp(a0);
a0 = a3;
a3 = a1;
a1 = tmp;
}
// a1 >= a3
// a2 >= a3
}
}
}
else { // a0 >= a2
if (a0 < a3) {
// a1 >= a2
if (a1 < a3) {
{
T tmp(a0);
a0 = a2;
a2 = a1;
a1 = tmp;
}
// a2 < a3
}
else { // a1 >= a3
{
T tmp(a0);
a0 = a2;
a2 = a3;
a3 = a1;
a1 = tmp;
}
// a2 < a3
}
}
else { // a0 >= a3
// a1 >= a2
// a1 >= a3
if (a2 < a3) {
{
T tmp(a0);
a0 = a2;
a2 = tmp;
}
{
T tmp(a1);
a1 = a3;
a3 = tmp;
}
}
else { // a2 >= a3
{
T tmp(a0);
a0 = a3;
a3 = a1;
a1 = a2;
a2 = tmp;
}
}
}
}
}
else { // a0 >= a1
if (a0 < a2) {
if (a0 < a3) {
{
T tmp(a0);
a0 = a1;
a1 = tmp;
}
// a1 < a2
// a1 < a3
if (a3 < a2) {
{
T tmp(a2);
a2 = a3;
a3 = tmp;
}
}
}
else { // a0 >= a3
// a1 < a2
if (a1 < a3) {
{
T tmp(a0);
a0 = a1;
a1 = a3;
a3 = a2;
a2 = tmp;
}
// a2 >= a3
}
else { // a1 >= a3
{
T tmp(a0);
a0 = a3;
a3 = a2;
a2 = tmp;
}
// a2 >= a3
}
}
}
else { // a0 >= a2
if (a0 < a3) {
if (a1 < a2) {
{
T tmp(a0);
a0 = a1;
a1 = a2;
a2 = tmp;
}
// a1 < a3
// a2 < a3
}
else { // a1 >= a2
{
T tmp(a0);
a0 = a2;
a2 = tmp;
}
// a1 < a3
// a2 < a3
}
}
else { // a0 >= a3
if (a1 < a2) {
if (a1 < a3) {
if (a2 < a3) {
{
T tmp(a0);
a0 = a1;
a1 = a2;
a2 = a3;
a3 = tmp;
}
}
else { // a2 >= a3
{
T tmp(a0);
a0 = a1;
a1 = a3;
a3 = tmp;
}
}
}
else { // a1 >= a3
{
T tmp(a0);
a0 = a3;
a3 = tmp;
}
// a2 >= a3
}
}
else { // a1 >= a2
if (a1 < a3) {
{
T tmp(a0);
a0 = a2;
a2 = a3;
a3 = tmp;
}
// a2 < a3
}
else { // a1 >= a3
if (a2 < a3) {
{
T tmp(a0);
a0 = a2;
a2 = a1;
a1 = a3;
a3 = tmp;
}
}
else { // a2 >= a3
{
T tmp(a0);
a0 = a3;
a3 = tmp;
}
{
T tmp(a1);
a1 = a2;
a2 = tmp;
}
}
}
}
}
}
}
} // DirectSort - 4 arguments.
NaN
。 - MSalters