web-dev-qa-db-ja.com

ソートを行うCライブラリ関数

ソートを行うためにC標準ライブラリで利用可能なライブラリ関数はありますか?

87
Ankur

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;
}
106
rerun

C/C++標準ライブラリ<stdlib.h>にはqsort関数が含まれます。

これは世界で最高の迅速なソートの実装ではありませんが、使用するのに十分高速で非常に簡単です... qsortの正式な構文は次のとおりです。

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);

実装する必要があるのはcompare_functionだけです。compare_functionは、「const void」型の2つの引数を受け取り、適切なデータ構造にキャストして、次の3つの値のいずれかを返します。

  • 負、aがbの前にある場合
  • 0、aがbに等しい場合
  • 正、aがbの後にある場合

1。整数のリストの比較

x < yx-yが負、x == yx-y = 0x > yx-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;
}
56
whacko__Cracko

確かに:qsort()はソートの実装です(名前が示すように必ずしもクイックソートではありません)。

Man 3 qsortを試すか、 http://linux.die.net/man/3/qsort で読んでください

7
McPherrinM

標準ライブラリには正確にありませんが、 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コンパイラで動作するはずです。

6

<stdlib.h>qsort()を使用します。

@paxdiablo qsort()関数は、ISO/IEC 9899:1990( `` ISO C90 '')に準拠しています。

4
prime_number

stdlib.hでqsortを試してください。

4

stdlib.hにはいくつかのCソート関数があります。 UNIXマシンでman 3 qsortを実行すると、それらのリストを取得できますが、以下が含まれます。

  • ヒープソート
  • クイックソート
  • マージソート
3
dj2