cwnicol programming

プログラミング関連の投稿をすこしだけ

qsortで複数キー(複数条件)でソート

qsortで複数キー(複数条件)でソートしたい時があるだろう。

 

f:id:katetyan:20160410114041p:plain

 

例えば、↑のデータを

[ソート条件]

・第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は

安定ソート - Wikipedia

ではないから。