qsort


目次に戻る


ソートってわかりますか?そう、データを一定の法則(昇順だとか降順)に並べ替えること です。
 
qsort関数は一般に知られているもっとも高速なソート「クイックソート」を提供する関 数です。
ただし、使い方に「クセ」があり、初めて使う人はとまどうと思います。
 
どこにクセがあるかというと、qsortでソートしたい配列の各要素を比較する関数を自 分で用意しなくてはいけないのです。以下の例の「mycompare関数」が各要素を比較する 関数になります。
 
後は、配列の大きさ(要素数)、配列の要素の大きさ(バイト数)を渡してあげます。そ うするとあら不思議。簡単にソートができてしまうのです。
 
昇順、降順ソートを導入したい場合は、自分で用意する比較関数の内容を変えます 。どうすれば逆になるかは各自で考えてみてください。
 
使用例1:文字列を並び替える。
#include <stdio.h>
#include <stdlib.h>

int mycompare( const void *s1 , const void *s2 )
{
    const char a1 = *((char*)s1);
    const char a2 = *((char*)s2);
    if( a1 < a2 ){
        return -1;
    } else if( a1 == a2 ){
        return 0;
    } else {
        return 1;
    }
}

int main()
{
    char data[]="gaeiogthraenmbhio";
    printf("before : %s\n" , data );
    qsort( data , sizeof(data)-1 , sizeof( data[0] ) , mycompare );
    printf("after  : %s\n" , data );
    return 0;
}

 
使用例2:構造体を並べ替える
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int a;
    char data[10];
} TData;

TData gdata[]={
    {10,"aaa"},{5,"bbb"},{45,"ccc"},{3,"ddd"},{14,"eee"},{6,"fff"}
};

int mycompare( const void *s1 , const void *s2 )
{
    const TData a1 = *((TData*)s1);
    const TData a2 = *((TData*)s2);
    if( a1.a < a2.a ){
        return -1;
    } else if( a1.a == a2.a ){
        return 0;
    } else {
        return 1;
    }
}

int main()
{
    char data[]="gaeiogthraenmbhio";
    int i;

    printf("before\n");
    for( i=0 ; i<sizeof(gdata)/sizeof(gdata[0]) ; i++ ){
        printf("%d %s\n",gdata[i].a,gdata[i].data);
    }

    qsort( gdata , sizeof(gdata)/sizeof(gdata[0]) , sizeof( gdata[0] ) , mycompare );

    printf("\nafter\n");
    for( i=0 ; i<sizeof(gdata)/sizeof(gdata[0]) ; i++ ){
        printf("%d %s\n",gdata[i].a,gdata[i].data);
    }

    return 0;
}

 
明日はsizeofの使い方を紹介します。


目次に戻る