qsort

void qsort( void *base, size_t num, size_t width
, int ( __cdecl *compare )( const void *, const void * ) )


widthに指定したバイト数の要素num個から成る配列baseを並べ替える。
base引数は、並べ替える配列のベースへのポインタである。
引数compareは、比較関数へのポインタである。
qsort 関数は、並べ替えの間に次のcompareルーチンを1回または複数回呼び出し、
そのたびに2つの配列要素へのポインタを渡す。
qsort関数は、並べ替えた後の要素で、この配列を上書きする。

比較関数はユーザーが自作する。
また、qsort関数の第4引数に示された仕様でなければならない。

比較関数は、要素を比較し、次のいずれかの値を返すこと。
< 0昇順:elem1はelem2より小さい、降順:elem1はelem2より大きい
0elem1 は elem2 に等しい
> 0昇順:elem1はelem2より大きい、降順:elem1はelem2より小さい



#include
#include // qsort用
#include // strcmp用

int intcmp( const void *, const void * );
int intrcmp( const void *, const void * );
int dblcmp( const void *, const void * );
int mystrcmp( const void *, const void * );

void main()
{
 int id[10] = { 45, 65, 23, 87, 53, 67, 32, 19, 73, 66 };
 double dd[10] = { 3.56, 7.43, 5.76, 3.67, 9.65, 5.64, 2.75, 4.55, 6.32, 4.78 };
 char *pstr[5] = { "apple", "orange", "banana", "lemon", "peach" };
 int i;

 printf( "--int昇順--\n" );
 qsort( id, 10, sizeof( int ), intcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--int降順--\n" );
 qsort( id, 10, sizeof( int ), intrcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--double昇順--\n" );
 qsort( dd, 10, sizeof( double ), dblcmp );
 for ( i=0; i<10; i++ ) printf( "%4.2f ", dd[i] );
 puts( "\n" );

 printf( "--文字列昇順--\n" );
 qsort( pstr, 5, sizeof( char* ), mystrcmp );
 for ( i=0; i<5; i++ ) printf( "%s ", pstr[i] );
 puts( "\n" );

}

int intcmp( const void *a, const void *b )
{
 return( *(int*)a - *(int*)b );
}

int intrcmp( const void *a, const void *b )
{
 return( *(int*)b - *(int*)a );
}

int dblcmp( const void *a, const void *b )
{
 if ( *(double*)a < *(double*)b )
  return -1;
 else if ( *(double*)a == *(double*)b )
  return 0;
 else
  return 1;
}

int mystrcmp( const void *a, const void *b )
{
 return strcmp( *(char**)a, *(char**)b );
}


実行結果

--int昇順--
19 23 32 45 53 65 66 67 73 87

--int降順--
87 73 67 66 65 53 45 32 23 19

--double昇順--
2.75 3.56 3.67 4.55 4.78 5.64 5.76 6.32 7.43 9.65

--文字列昇順--
apple banana lemon orange peach


自作する比較関数ですが、古いテキストの記述方法だと蹴られまくりました。
恐るべし。
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

Comments

Comment Form

icons:

Trackbacks