C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


書式

#include <stdlib.h>

void qsort( void * data , size_t data_cnt
       , size_t data_size
       , int( * func )( const void * , const void * );

■戻り値:
なし

説明

qsort(クイックソート)関数の引数が分かりにくいので以下に示す。

void * data:ソート対象データ
size_t data_cnt:ソート対象データ件数
size_t data_size:ソート対象データ1件当りのサイズ
int func:int型の比較関数(プログラマが作成する関数)

但し、比較関数funcは、int型の関数で、第1引数には「const void *」型、第2引数も同じ「const void *」型でなければならない。また、比較関数funcでは以下の様に返却値が規定されている。

第1引数 < 第2引数 の場合は負の整数を返す
第1引数 = 第2引数 の場合はゼロを返す
第1引数 > 第2引数 の場合は正の整数を返す

これは、strcmpmemcmpなどの比較関数の返却値と同一である。

以下にサンプルとしてint型データのソート、及び文字列型データのソートを示す。

サンプル(int型データをソート)

#include <stdlib.h>

/* ソート関数 */
int int_sort( const void * a , const void * b ) {
  /* 引数はvoid*型と規定されているのでint型にcastする */
  if( *( int * )a < *( int * )b ) {
    return -1;
  }
  else
  if( *( int * )a == *( int * )b ) {
    return 0;
  }
  return 1;
}

/* メイン関数 */
main() {
  size_t data_cnt , i;
  int data[5];

  /* データ件数を求める */
  data_cnt = sizeof( data )/sizeof( data[0] );

  /* データを設定する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    data[i] = data_cnt - i;
  }

  /* 設定されたソート前のデータを参照する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    printf( "data[%d]=%d\n" , i , data[i] );
  }

  /* ソート処理 */
  qsort(( void * )data , data_cnt , sizeof( data[0] )
                                             , int_sort );

  /* ソート後のデータを参照する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    printf( "data[%d]=%d\n" , i , data[i] );
  }
}

実行結果(int型データをソート)

data[0]=5
data[1]=4
data[2]=3
data[3]=2
data[4]=1
data[0]=1
data[1]=2
data[2]=3
data[3]=4
data[4]=5

サンプル(char型データをソート)

#include <stdlib.h>

/* ソート関数 */
int int_sort( const void * a , const void * b ) {
  return strcmp(( char * )a , ( char * )b );
}

/* メイン関数 */
main() {
  size_t data_cnt , i;
  char data[5][4];

  /* データ件数を求める */
  data_cnt = sizeof( data )/sizeof( data[0] );

  /* データを設定する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    sprintf( data[i] , "aa%d" , data_cnt - i );
  }

  /* 設定されたソート前のデータを参照する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    printf( "data[%d]=%s\n" , i , data[i] );
  }

  /* ソート処理 */
  qsort(( void * )data , data_cnt , sizeof( data[0] )
                                             , int_sort );

  /* ソート後のデータを参照する */
  for( i = 0 ; i < data_cnt ; i++ ) {
    printf( "data[%d]=%s\n" , i , data[i] );
  }
}

実行結果(char型データをソート)

data[0]=aa5
data[1]=aa4
data[2]=aa3
data[3]=aa2
data[4]=aa1
data[0]=aa1
data[1]=aa2
data[2]=aa3
data[3]=aa4
data[4]=aa5


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.