- 締切済み
バブルソート、あなたはどちら派?
昇順にソートする場合ですが、 配列の先頭とその次の値を比較し、大きい数字の方を後ろへ持っていくパターンと 配列の最後とその手前を比較し、小さい数字を前へ持っていくパターンがあると思います。 前者のほうが、湖底から水面へ泡がだんだん大きくなっていくバブルのイメージで 長年これがスタンダードだと思っていたのですが、 後者についてを「小さい泡がだんだん移動していくイメージなのでバブルソートと言う」と 断言しているサイトや書籍もあります。 どちらも間違いではないと思います。 ですが、他人に教えることを想像したとき、 どちらかというと先に前者を教えてから、後者のやり方もあるよと伝えた方が 直感的に理解しやすいかなと思いました。 皆さんはどちら派ですか? また、前者と後者を使い分けるメリットがもしもあればご教示頂けませんか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- akayoroshi
- ベストアンサー率50% (46/91)
後者の方です。データ件数が100程度以下であれば挿入ソートを使うのですが、後者のバブルソートの1回目のスキャンだけをやって、最小値を先頭にもってくることで安定な挿入ソートの番兵としています。
- weavaest
- ベストアンサー率15% (157/1020)
前者です。 バブルソートの名前のことは、なんか意味があるんだろうな程度の認識です。
- pringlez
- ベストアンサー率36% (598/1630)
バブルソートに限りませんが、特別な理由がない限りは先頭から順に処理をするものだと思います。また、「バブルソート」という名称を考えてから処理内容を考えたということもまずありえないでしょうから、「バブルのイメージに合うのは前からか後ろからか」という考え方のアプローチ方法がナンセンスに感じます。 「泡がだんだん大きくなっていくイメージ」で実装しなければならないというルールとなると、降順の場合は末尾から処理をすることになるのでしょうか?あるいは降順の場合はバブルソートとは呼べないのでしょうか?私にとってはそれもおかしく、昇順だろうと降順だろうと先頭から処理をすべきだと思います。 どうしてもイメージにこだわるのなら…、水面は基準ですから配列で言うと0番目に相当し、湖によって深さは異なるので湖底が配列の末尾に該当すると思います。ですので、「湖底から水面へ」を表現するなら、むしろ配列の末尾から処理をするのが妥当に思えてしまいます。なのでその逆になる考えが、湖と配列をどのように対応させてイメージしているのかむしろ気になります。
- Lchan0211b
- ベストアンサー率61% (573/930)
どちらをイメージするかというと、私も前者をイメージしますが、 「バブル」という言葉をどうイメージするかというだけの話であり、 どちらでも本質的な違いはないと思います。 なので、前者の方法を説明した後、わざわざ後者の方法まで説明しません。 他のソート方式でも、処理方法は異なるが本質的な考え方は同じ方式である と言えるものはいくつもあり、それをいちいち説明していたらきりがないし、 プログラミング初心者にたくさんの処理方法を説明するのは 余計な混乱を招く可能性もあると思います。
私は「大きい数字を後ろに持っていく」パターンで話をしますね。イメージとしては質問者さんと同じで「湖底から水面へ泡が上がっていくイメージ」なのですが、私が「大きい値」側を湖面としているのは「高さ(標高)」のイメージがあるからです。 質問者さんの「泡がだんだん大きくなっていく」イメージは、「泡として移動していく値」がだんだん大きくなっていくような、余計なイメージが浮かぶので、良くないように思います。
- ggggggggggg hhhhhhhhhhh(@tasketeqq1)
- ベストアンサー率15% (36/231)
ソートのロジックは他にも数種類あります。 それぞれスピードが違うわけですが、考えるまでもなく速いものがいいです。 でもそれは、コンピュータの性能が悪かった時代の考えです。 今のパソコンならどれでやっても気になるような時間ではありません。 腰を抜かすような件数を対象とするなら別ですが。
お礼
回答ありがとうございます。 えーと、今回の質問の意図は、バブルソートのアルゴリズムで 「前から後ろに持っていく派」か、「後ろから前に持っていく派」かを 問うているのですが、いかがでしょうか。 なお、走査が前後逆なだけですのでこれによる速度の違いは無く、 あくまで好みの問題かと思っていますが・・・。 高速なソートのロジックが他にもあるのは承知の上です。 文中にもあるように、「他人に教えることを想像したとき」に どちらのスタンスで説明するかを知りたいです。 プログラミングを全く知らない人を相手に教えるときのことを 想定して頂ければと思います。