3 C言語のqsort()関数

C言語にはqsoort()が実装されており,それはクイックソートが使われていることが 多い.そのため,実際のプログラムでは,プログラマーがソートのルーチンを記述するこ とは希で,このqsort()関数をつかう.お手軽なので,諸君はこれを使うのが良いだ ろう.

この関数は,標準ライブラリー関数で,stdlib.hをインクルードすることにより使 うことができる.プログラムの先頭付近に

	#include <stdlib.h>
と書けば,インクルードできる.

このqsort()関数を使う場合の引数の渡し方であるが,それは教科書(Table 1-1)に 書いてあるとおりである.正確な記述は教科書の通りであるが,もう少し分かりやすく書 くと

	void qsort(配列名, 配列の数, 配列一つのバイト数, 比較関数)
となる.返値はなく,配列そのものがソートされる.引数はデータを入れてある配列に関 するものと比較関数である.

ここで,ちょっと難しいのは,比較関数の作り方である.それを,教科書の例(List 1-4) で示すことにする.教科書の比較関数は,

	int compare(const void *arg1,const void *arg2)
	{
	    return(*((int *)arg1)-*((int *)arg2));
	}
となっている.返値は整数型と宣言されている.qsort()関数の引数で渡す比較関数 の返値は整数と決められているので,それに従っている.問題は引数で,constは引 数が変化しないことを明示的に示している.arg2を左辺値として,代入文を使うと エラーが発生する.つぎのvoidは,arg1arg2はポインターであるが, その型は後で決めると言うことである.実際このプログラムでは,強制型変換(キャスト) を使って決めている.

つぎにこの関数の計算であるが,次の文が難しい.

	*((int *)arg1
まずこれは,(int *)arg1arg1を整数型のポインターに強制的に型変換して いる.そして,もっとも左にあるアスタリスク*で,そのポインターが示す値を取り 出している.

ちょっと難しいが,C言語では,引数として変数のみならず関数も引数で送ることができ るのである.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年10月27日


no counter