ソートを行うために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;
}
C/C++標準ライブラリ<stdlib.h>
にはqsort
関数が含まれます。
これは世界で最高の迅速なソートの実装ではありませんが、使用するのに十分高速で非常に簡単です... qsortの正式な構文は次のとおりです。
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
実装する必要があるのはcompare_functionだけです。compare_functionは、「const void」型の2つの引数を受け取り、適切なデータ構造にキャストして、次の3つの値のいずれかを返します。
1。整数のリストの比較:
x < y
、x-y
が負、x == y
、x-y = 0
、x > y
、x-y
が正の場合、単純にaとbを整数にキャストします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。文字列のリストの比較:
文字列を比較するには、<string.h>
lib内のstrcmp
関数が必要です。 strcmp
はデフォルトで-ve、0、veを適切に返します...逆の順序でソートし、strcmpによって返された符号を逆にします。
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
。浮動小数点数の比較:
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;
}
確かに:qsort()
はソートの実装です(名前が示すように必ずしもクイックソートではありません)。
Man 3 qsortを試すか、 http://linux.die.net/man/3/qsort で読んでください
標準ライブラリには正確にありませんが、 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コンパイラで動作するはずです。
<stdlib.h>
でqsort()
を使用します。
@paxdiablo qsort()
関数は、ISO/IEC 9899:1990( `` ISO C90 '')に準拠しています。
stdlib.hでqsort
を試してください。
stdlib.h
にはいくつかのCソート関数があります。 UNIXマシンでman 3 qsort
を実行すると、それらのリストを取得できますが、以下が含まれます。