我发现了Swenson的Timsort的C实现: 其中一个较旧的SO问题中提到了https://github.com/swenson/sort。
我遇到了两个问题:
1)要使用它,我需要定义适合我想要排序的类型的SORT_CMP宏。 我的类型被定义为(这里有点简化):
typedef struct{
int a;
int b;
} MyType
我尝试定义:
#define SORT_TYPE MyType
#define SORT_CMP(x,y) (x.a - y.a)
但我一直收到错误:“请求成员'a'在非结构或联合的东西中” 我想也许x和y可能是指针但是:
#define SORT_CMP(x,y) (x->a - y->a)
也不起作用。 你能帮帮我吗?我是C新手,可能缺少基本的东西。
2)有没有办法在Visual Studio中编译该代码?它使用较新的C标准中的东西(如块中间的声明),cl.exe不接受它。我使用GCC(mingw)编译它,但mingw对于我的其余代码比VC慢20%(使用O2或O3标志与使用/ Ox的lc.exe)因此使用Timsort而不是stdlib qsort可以获得任何收益不会弥补这一点。 Pelles编译器也是如此。 我的大部分数据都有很多部分排序的序列,排序占用了大约50%的执行时间,因此我觉得假设我在VC中使用它会有好处。
答案 0 :(得分:2)
您可以尝试在宏参数周围添加括号,如下所示:
#define SORT_CMP(x,y) ((x).a - (y).a)
很可能宏用于指向SORT_TYPE变量的解引用指针:
SORT_TYPE * pMyTypeVar1, pMyTypeVar2;
...
SORT_CMP(*pMyTypeVar, *pMyTypeVar2);
如果那些宏参数周围的括号丢失,预处理器会生成如下内容:
(*pMyTypeVar1.a - *pMyTypeVar2.a)
由于点运算符绑定比星型运算符更紧密,编译器会尝试找到指针a
和pMyTypeVar1
的成员pMyTypeVar2
,这将无效。
使用建议的括号将导致:
((*pMyTypeVar1).a - (*pMyTypeVar2).a)
这样编译器首先取消引用pMyTypeVar1
和pMyTypeVar2
,最后能够找到成员a
。