Cでの数値の大きな配列をソートするための良いライブラリはありますか?
-
19-09-2019 - |
質問
、良いアルゴリズムが/何です (Cで)ソートするための実装?
それは少し遅れて、編集のためのゲームである...しかし、私は正確を探しています。のスピードの
解決 2
の数字の配列をソートするために、基数ソートアルゴリズムを検討します。適切に設計された場合、これらの種類はGLIBCののqsort()よりも優れた性能を提供する必要があります。
usortライブラリは、すべての主要なC数値型の型固有の実装が含まれています。
http://bitbucket.org/ais/usort/wiki/Homeする
GLIBCのqソート上基数ソートの速度の利点は約2.5倍私の64ビットIntelのラップトップ上でN = 1000000で浮動小数点数、倍精度のためのものです。 Nが大きくなるにつれて基数ソートがデータを通過する一定の数を必要とする線形時間アルゴリズムであるので、利点はさらに大きくなければならない。
非常に小さなNについては、同一の符号は、イントロソートや挿入ソートにディスパッチ。
他のヒント
のqsort()標準ライブラリからgood'unである。
比較関数は、これらのケースのために些細なことになります。
int cmp_int(const void *a, const void *b)
{
const int *ia = a;
const int *ib = b;
if (*ia < *ib)
return -1;
if (*ia > *ib)
return 1;
return 0;
}
int cmp_float(const void *a, const void *b)
{
const float *fa = a;
const float *fb = b;
if (*fa < *fb)
return -1;
if (*fa > *fb)
return 1;
return 0;
}
(EDIT:これらのバージョンの符号付きオーバーフロー挙動に依存しているので、それは良い考えではないからBを減算に基づく。)
これはのqsort に使用することが悪い考えことはありません...あなたは数字について何かを知っている場合を除きます。
あなたは基数ソートでタグ付けしました。どのくらいのメモリあなたが投資する用意がありますか?特定の範囲内の数字はありますか?彼らは実現可能なソート基数作る性質を持っていますか?
あなたは多くのメモリを使用する場合を除き、、qソートは素晴らしい選択肢です。
私たちは、次のセットのソートが可能であるが、最近で取得しているRAMの膨大な量を考える:あなたが持っているそれぞれの番号のための巨大なRAMビット列のビットをマークし、その後、RAMをスキャンして、それらをバック読み取ります。ハードウェア固有の最適化の多くは、マークとスキャンのフェーズに適用することができます。