ソートを行うためにC標準ライブラリで使用可能なライブラリ関数はありますか?
ソートを行うためにC標準ライブラリで使用可能なライブラリ関数はありますか?
回答:
qsort()
あなたが探している機能です。データの配列へのポインタ、その配列内の要素の数、各要素のサイズ、および比較関数を使用して呼び出します。
それはその魔法を行い、あなたの配列はその場でソートされます。次に例を示します。
#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2)
{
int f = *((int*)elem1);
int s = *((int*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
int main(int argc, char* argv[])
{
int x[] = {4,5,2,3,1,0,9,8,6,7};
qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);
for (int i = 0 ; i < 10 ; i++)
printf ("%d ", x[i]);
return 0;
}
return (f > s) - (f < s);
qsort
関数」ポイント4「2つの要素が等しいと比較される場合、結果のソートされた配列での順序は指定されていません。」
C / C ++標準ライブラリに<stdlib.h>
はqsort
関数が含まれています。
これは世界で最も速いクイックソートの実装ではありませんが、十分に速く、非常に簡単に使用できます... qsortの正式な構文は次のとおりです。
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
実装する必要があるのは、compare_functionだけです。この関数は、「const void」型の2つの引数を取り、適切なデータ構造にキャストして、次の3つの値のいずれかを返します。
1.整数のリストを比較する:
単にあれば整数にaとbをキャストしx < y
、x-y
負である、x == y
、x-y = 0
、x > y
、x-y
正がされ
x-y
、それが逆に:)実行するショートカットの方法である*x - *y
に*y - *x
減少/逆順にソートするために
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2.文字列のリストを比較する:
文字列を比較するには、lib strcmp
内に関数が必要<string.h>
です。
strcmp
デフォルトでは-ve、0、veを適切に返します...逆順にソートするには、strcmpによって返される符号を逆にします
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3.浮動小数点数の比較:
int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}
4.キーに基づくレコードの比較:
レコードなど、より複雑なものをソートする必要がある場合があります。これは、qsort
ライブラリーを使用して行う最も簡単な方法です。
typedef struct {
int key;
double value;
} the_record;
int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}
int
、コンパレータに渡される値は両方ともにint *
偽装されvoid *
ます。char *
したがって、の配列をソートする場合、コンパレータに渡される値は両方ともにchar **
偽装されvoid *
ます。したがって、正しいコードは次のようにする必要がありますint compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
。
if (x > y) return +1; else if (x < y) return -1; else return 0;
するか、単純な式が必要な場合はを検討してくださいreturn (x > y) - (x < y);
。これは常にCレベルで2つの比較を評価しますが、オプティマイザはそれを回避できる可能性があります。減算は、符号なしの値では機能しません。最初のバージョンは、一連の比較を処理しているときにうまく機能します。最初に構造体の2つの整数メンバーを比較し、それらが等しい場合は2つのdouble、次に2つの文字列などです。これを行う方法は複数ありますが、 CおよびPerl。
確かに: qsort()
はソートの実装です(名前が示唆するように必ずしもクイックソートである必要はありません)。
qsort
Quicksortを使用して実装する必要はありません。
標準ライブラリには正確にはありませんが、https://github.com/swenson/sortには、次のように、信じられないほど高速な幅広いソートルーティングにアクセスするために含めることができる2つのヘッダーファイルがあります。
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP (x 、y )((x )- (y ))#include "sort.h" / *これで、int64_quick_sort、int64_tim_sortなどにアクセスできます。 int64_quick_sort (arr 、128 ); / *いくつかのint * arrまたはint arr [128]があると想定します。* /
これはqsort
、関数ポインターを使用しないため、標準ライブラリーの少なくとも2倍の速さである必要があり、その他の多くのソートアルゴリズムオプションから選択できます。
それはC89にあるので、基本的にすべてのCコンパイラで動作するはずです。
qsort
stdlib.hで試してください。
には、いくつかのCソート関数がありますstdlib.h
。あなたman 3 qsort
はそれらのリストを取得するためにUNIXマシンで行うことができますが、それらには以下が含まれます: