C言語編 標準ライブラリのリファレンス「Q」

このエントリーをはてなブックマークに追加

「Q」で始まる標準ライブラリ関数及び、その他の定義です。

qsort関数

概要 配列をソートする。
ヘッダ stdlib.h
形式 void qsort(void* base, size_t count, size_t size, int (*compar)(const void* elem1, const void* elem2));
引数 base ソート対象の配列のアドレス。
count ソート対象の配列の要素数。
size 要素1つのサイズ。
compar 要素の大小関係を比較する関数へのポインタ。
この比較関数は、第1引数に渡された値が第2引数に渡された値よりも小さいとき 0未満の値を、同じとき 0 を、大きいとき 1以上の値を返すように定義する。 この場合、昇順にソートされる。降順にソートしたければ、小さい場合と大きい場合との値を逆転させれば良い。
比較関数に渡される実引数は、比較対象の要素へのポインタである。
戻り値
詳細 配列base をソートする。要素同士の大小関係を比較するために、外部に関数を定義し、その関数へのポインタを渡す必要がある。
一般に、クイックソートによって実装されているが、その保証は特にない。
注意 比較関数の中で、引数に渡されたポインタを実際の要素の型のポインタにキャストした後、間接参照によって、要素の書き換えを行ってはならない。
使用例
#include <stdio.h>
#include <stdlib.h>

#define SIZE_OF_ARRAY(array)	(sizeof(array)/sizeof(array[0]))

int compareInt(const void* a, const void* b);

int main(void)
{
	int table[] = { 66, 85, 70, 92, 61, 89 };
	size_t size = SIZE_OF_ARRAY( table );
	size_t i;


	qsort( table, size, sizeof(int), compareInt );

	for( i = 0; i < size; ++i ){
		printf( "%d ", table[i] );
	}
	printf( "\n" );

	return 0;
}

/*
	int型による順序比較。

	引数:
		a:	比較する要素。
		b:	比較する要素。
	戻り値:
		a の方が小さいとき負数、
		b の方が小さいとき 0 より大きい値、
		a と b が同じときは 0、
		 が返される。
*/
int compareInt(const void* a, const void* b)
{
	int aNum = *(int*)a;
	int bNum = *(int*)b;

	if( aNum < bNum ){
		return -1;
	}
	else if( aNum > bNum ){
		return 1;
	}
	return 0;
}

実行結果:

61 66 70 85 89 92
関連 標準サーチ関数として bsearch関数が存在する。 bsearch関数は、対象配列がソート済みであることを要求するため、よくセットで使用される。
解説章 第37章

参考リンク

Cクイックリファレンス 第2版
 -- C11対応のリファレンス。
S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル 第5版
 -- C99 まで網羅した最も詳細なリファレンス。
新ANSI C言語辞典
 -- 標準ライブラリについて詳しい。C99 には非対応。

更新履歴

'2017/5/13 配列の要素数を求めるマクロを、他のページと同じ形の SIZE_OF_ARRAYマクロに統一。

'2010/5/4 qsort関数の説明を追加。

'2010/1/23 新規作成。



標準ライブラリのリファレンスのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ