MW211 EXIT

devlog
C言語/qsort()
2013年03月29日
qsort関数は、第四引数に比較関数名を指定して、
その比較関数で昇順降順の実装を行う。
なお、昇順と降順は、比較する項目の順番を入れ替えるだけ切り替えることができる。

数値配列を並び替える場合。
┌──────────────────────────────────────┐
│int  配列[] = {3,1,5,2,4};  // サンプルデータ                               │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合  → 1,2,3,4,5                                             │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return *(int*)a - *(int*)b;                                             │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合  → 5,4,3,2,1                                             │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return *(int*)b - *(int*)a;                                             │
│}                                                                           │
└──────────────────────────────────────┘

文字列配列を並び替える場合。
┌──────────────────────────────────────┐
│char*  配列[] = {"ccc","aaa","eee","bbb","ddd"};  // サンプルデータ         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合  → "aaa","bbb","ccc","ddd","eee"                         │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合  → "eee","ddd","ccc","bbb","aaa"                         │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
└──────────────────────────────────────┘
strcmp()を使うところがミソ。

※NULLの対策が抜けていた(後述)
分類:C/C++