大佬教程收集整理的这篇文章主要介绍了c – 快速排序3个值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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
以上是大佬教程为你收集整理的c – 快速排序3个值全部内容,希望文章能够帮你解决c – 快速排序3个值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。