Swenson の Timsort の C 実装を見つけました: https://github.com/swenson/sortは古い SO の質問の 1 つに記載されています。
2 つの問題が発生しました。
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)ため、stdlib qsortの代わりにTimsortを使用することで得られる利益それを補うことはありません。同じことが Pelles コンパイラにも当てはまります。私のデータのほとんどには、部分的にソートされたシーケンスが多数あり、ソートには実行時間の約 50% がかかるため、VC で動作させると仮定すると、ここで利益が得られると感じています。