B - Guidebook
こういう問題が出たときに、
Bみたいなやつのこういうソート方法はもっと知られてもいいと思うの(pairとかでやると後々使うときにfirstとかsecond.secondとかで脳が死ぬので)https://t.co/kM2KVzN0qN pic.twitter.com/a4wh7i8PPh
— てんぷら (@tempura_cpp) May 26, 2019
こういう方法をとれますが(てんぷらさんありがとうございます)、何も頭を使わずに書いてると頻繁にバグらせたので、このソートでなにがどうなるのか備忘録的に書いておきます。
そもそもどういうソート?
数列をソートするととなりますが、もともとが何番目にあったのかを思い出すことができません。思い出したいときによく考えるのは
というstd::pairの配列を作ってソートすることで、これだと
となって、無事がソート前は0番目だったことを覚えたままソートできています。これが「覚えたまま」の意味です(わかりにくくてすみません)。
で、これだとfirst.secondやらsecond.firstやら出てきがちで嫌な気分になるので、もっとシンプルにやろうというのが前述のてんぷらさんのツイートにあったソート方法です。
どうなるの?
数列本体は入れ替えず、ordが入れ替わります。
ソート後の数列のi番目はnum[ord[i]]になり、
もともとord[i]番目にいたやつがi番目にやってきたことになります。
複雑にソートやらなんやらかんやらを繰り返すときも、数列そのものは絶対入れ替えない方針で実装するとたぶん見通しが良くなるんだと思います(それはそう)。
おわりに
全然整理できてない雑な備忘録で申し訳ないです。
また、他のところでもこの方法が紹介されていたりとか、もっといいほうがあったりとか、この記事に誤りが含まれていたりとかしたら教えていただけると嬉しいです。