我需要排序很多由8个浮点组成的小数组.最初我使用std :: sort但对其性能不满意,我尝试了由此生成的比较交换算法:
http://pages.ripco.net/~jgamble/nw.html
测试代码如下:
template <typename T> bool PredDefault(const T &a,const T &b) {return a > b;} template <typename T> bool PredDefaultReverse(const T &a,const T &b) {return a < b;} template <typename T> void Sort8(T* Data,bool(*pred)(const T &a,const T &b) = PredDefault) { #define Cmp_Swap(a,b) if (pred(Data[a],Data[b])) {T tmp = Data[a]; Data[a] = Data[b]; Data[b] = tmp;} Cmp_Swap(0,1); Cmp_Swap(2,3); Cmp_Swap(4,5); Cmp_Swap(6,7); Cmp_Swap(0,2); Cmp_Swap(1,6); Cmp_Swap(5,7); Cmp_Swap(1,2); Cmp_Swap(5,6); Cmp_Swap(0,4); Cmp_Swap(3,7); Cmp_Swap(1,5); Cmp_Swap(2,6); Cmp_Swap(1,6); Cmp_Swap(2,5); Cmp_Swap(3,4); } int lastTick; int tick() { int hold = lastTick; lastTick = GetTickCount(); return lastTick - hold; } int main() { vector<vector<float>> rVec(1000,vector<float>(8)); for (auto &v : rVec) { v[0] = ((float)rand()) * 0.001; v[1] = ((float)rand()) * 0.001; v[2] = ((float)rand()) * 0.001; v[3] = ((float)rand()) * 0.001; v[4] = ((float)rand()) * 0.001; v[5] = ((float)rand()) * 0.001; v[6] = ((float)rand()) * 0.001; v[7] = ((float)rand()) * 0.001; } system("PAUSE"); tick(); for (int n = 0; n < 50000; n++) for (int j = 0; j < rVec.size(); j++) { std::sort(rVec[j].begin(),rVec[j].end(),PredDefault<float>); std::sort(rVec[j].begin(),PredDefaultReverse<float>); //Sort8(rVec[j].data(),PredDefault<float>); //Sort8(rVec[j].data(),PredDefaultReverse<float>); } cout << "\nTime: " << tick() << "\n"; system("PAUSE"); return 1; }
我没有期待太多,但差异是10倍支持交换排序的东西(在vs2012的发布配置中完成测试,关闭了节能功能).结果也检查出来.这是正确的吗?
解决方法
有几个原因我可以想到.
>您有硬编码比较.这有助于管道化多个指令,从而提高效率.但想象一下编码为N = 1000.你必须写1000 * 1000比较.> std :: sort进行O(nlogn)比较.但是这个大O符号适用于大N,因为符号常量可能很大.因此,您无法通过运行8个值的范围来判断效率.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。