c – 排序:这种性能差异是真的还是我做错了?

我需要排序很多由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个值的范围来判断效率.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...