微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 快速排序3个值

我有一个三个浮点值的数组,我想按升序对它们进行排序(尽管任何排序算法的顺序都可以很容易地反转).调用std :: sort似乎有点矫枉过正:
float values[3] = {...};
std::sort(values,values + 3);

你可以这样做:

float sorted[3] = {min(values),values[0] + values[1] + values[2] -
    min(values) - max(values),max(values)};

但这看起来很丑陋.添加和减去数字也可以改变中间排序元素的值.并且它不容易就地工作.
也很有趣:

float sorted[3];
/*for(int i = 0; i < 3; ++ i) { // unroll
    sorted[(values[i] > values[0]) + (values[i] > values[1]) +
        (values[i] > values[2])] = values[i];
}*/ // this is broken,does not work if two or all values are equal
sorted[(values[0] > values[1]) + (values[0] > values[2])] = values[0];
sorted[(values[1] >= values[0]) + (values[1] > values[2])] = values[1];
sorted[(values[2] >= values[0]) + (values[2] >= values[1])] = values[2];

但这种情况取决于比较结果如何转换为整数(可能是比较标志加载指令).还取决于编译器如何优化每个元素与其自身的比较,如果考虑特殊的浮点值,这并不容易.也不适用于现场.

#define cswap(a,b) do { if(a > b) { float tmp = a; a = b; b = tmp; } } while(0)
cswap(values[0],values[1]);
cswap(values[1],values[2]);
cswap(values[0],values[1]);

可能有一个排序网络,但我想这不是最佳的排序,而不是两个元素的权力.只有三个元素……似乎应该有一个非常简单的方法,但也许没有.

什么是最小的,同时快速排序三个数字?可读性不是一个问题.

这有点类似于Fastest sort of fixed length 6 int array,但在这里我会期待一些简短而快速代码,因为排序3值可能用比任意数量的项目的排序循环更少的代码行编写.

结果:

在英特尔酷睿i7-2620M和Windows 7上发布的100亿个数字上测量,使用rand()生成数字,但是减去了内部花费的时间.

std::sort method: 3.510 sec
min/max method: 2.964 sec
comparison insertion: 2.091 sec (the fixed version,2.292 for the buggy one)
sort3() by Jarod42: 1.966 sec
sorting network: 1.903 sec

解决方法

一般算法是:
if (a[0] > a[1])
    swap(a[0],a[1]);
if (a[0] > a[2])
    swap(a[0],a[2]);
if (a[1] > a[2])
    swap(a[1],a[2]);

原文地址:https://www.jb51.cc/c/114810.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐