qsortで複数キー(複数条件)でソート
qsortで複数キー(複数条件)でソートしたい時があるだろう。
例えば、↑のデータを
[ソート条件]
・第1ソートキー:AAA列の昇順
・第2ソートキー:BBB列の降順
で並び替えたいとしよう。
qsort()では一つのキーしか設定できないと思われがちだが、
qsort()の第4引数の比較関数を「ある2要素間の前後関係を返す」つくりに
すれば、複数キーに対応できる。
※今回のサンプルでは条件を2つとしているが、比較関数を増やせば
3つ以上も対応可能。
以下サンプルソース。
[実行結果]
[ソート前]
bb 2 xx
aa 5 yy
aa 60 ww
aa 5 xx
bb 3 yy
cc 30 ww
cc 12 xx
cc 12 yy
[ソート後]
aa 60 ww
aa 5 yy
aa 5 xx
bb 3 yy
bb 2 xx
cc 30 ww
cc 12 yy
cc 12 xx
続行するには何かキーを押してください . . .
[注意点]
上記例において、元のデータで、
cc 12 xx
cc 12 yy
という並びがあったが、ソート後に
cc 12 yy
cc 12 xx
と並び変わっている。(末尾2データ)
[ソート条件]から、この2要素の前後関係は同等であるが、
qsort前後で前後関係が同等なデータの順序は保証されない。
なぜならば、qsortは
ではないから。