ソートする限り、書き込み後まだ既製最も快適に感じます。実際には、クイックソートのSTDLIBライブラリと実際にC言語、が、その関数呼び出しインタフェースはとても困難な、複雑すぎます。思い出を深めるので、このブログを書くために
関数のプロトタイプを初めて目
_CRTIMP のボイド __cdeclのqsort(ボイド * 、size_tの、size_t型、int型(*)(constの ボイド *、constの ボイド *))
これは、実際にCRTIMPだけのマクロ定義を(文句を言うには余りにも多くを理解していない)されて非常に複雑に見えます
、次のようにその実際の意味があります
C - C言語
R -実行実行
TIM -時間侯
P -パラメータ
__cdeclシステムはまた、事前に定義されたマクロです。(このような、それはあなたの母親のこと自己利益を意味するべきではありませんprintf関数、など不確実な入力パラメータ、サポートされているようです)。
voidを返すのNULL、のqsort関数名。
括弧:
最初のパラメータは、任意のデータ型の第1のアドレスを表す;
第二のパラメータは、空間の任意のデータ型の代表的な、すなわち長さであり、
第三のパラメータは、データ型のサイズを表す;
第四パラメータの順序ここで最も厄介で、我々は比較関数CMPを書かなければなりません()。小規模から大規模まで1戻り、-1降順、返された
理論を使用する方法を直接見、あまり話さない:
:整数比較を
int型 NUM [ 100 ]。 int型の CMP(CONST 無効 *、constの 無効 * B) { リターン *(int型 *)A> *(int型 *)B?1: - 1 。 } のqsort(NUM、100、はsizeof(NUM [ 0 ])、CMP)。
減算省、データのオーバーフローの恐れ。
二、char型の比較
1 文字の単語[ 100 ]。 2 3 int型 CMP(CONST ボイド *、CONST ボイド * B) 4 { 5 リターン *(CHAR *)A> *(CHAR *)B 1?- 1 ; 6 } 7 8のqsort(ワード、100、はsizeof(ワード[ 0 ])、CMP)。
第三に、浮動小数点の比較
二重 に [ 100 ]。 int型の CMP(CONST 無効 *、constの 無効 * B) { リターン *(ダブル *)A> *(ダブル *)B?1: - 1 。 } のqsort(中、100、はsizeof(で [ 0 ])、CMP)。
比較の第四に、構造
typedefの二重ElemtTypeの 構造体において { ElemtTypedata。 int型その他; } S [ 100 ]; int型 CMP(CONST ボイド *、CONST ボイド * B) { リターン(*(構造体において*)A).DATA>(*(構造体において*)b)の.DATA?1: - 1 。 } のqsort(S、100、はsizeof(S [ 0 ])、CMP)。
構造の五、2つのソート
ストラクトは { int型、X のint yと; } Sを[ 100 ]; // xがyに応じて等しい降順で大X、小規模に従って INT CMP(CONST ボイド * A、CONST ボイド *のB) { 構造体 * C IN(= 構造体において* )A; 構造体において* D =(構造体において* )B; IF(C-> X = D-> X!)を返す > X C-を- D-> X; 他 戻り Dを- > Y - C-> Y; } qソート(S、100、sizeof(S [ 0 ])、CMP)。
第六に、文字列のソート
ストラクトは { int型のデータを、 チャー STR [ 100 ]; } S [ 100 ]; // 文字列strの構造に辞書ソート INT CMP(CONST ボイド *のA、CONST ボイド *のB) { リターンのstrcmp((* (構造体において、*)A) - > STR、(*(構造体において*)B) - > STR); } のqsort(S、100、はsizeof(S [ 0 ])、CMP)。
人生は簡単ではありません、紳士は、お互いを励まします