• 締切済み

バブルソート、あなたはどちら派?

昇順にソートする場合ですが、 配列の先頭とその次の値を比較し、大きい数字の方を後ろへ持っていくパターンと 配列の最後とその手前を比較し、小さい数字を前へ持っていくパターンがあると思います。 前者のほうが、湖底から水面へ泡がだんだん大きくなっていくバブルのイメージで 長年これがスタンダードだと思っていたのですが、 後者についてを「小さい泡がだんだん移動していくイメージなのでバブルソートと言う」と 断言しているサイトや書籍もあります。 どちらも間違いではないと思います。 ですが、他人に教えることを想像したとき、 どちらかというと先に前者を教えてから、後者のやり方もあるよと伝えた方が 直感的に理解しやすいかなと思いました。 皆さんはどちら派ですか? また、前者と後者を使い分けるメリットがもしもあればご教示頂けませんか?

みんなの回答

回答No.6

後者の方です。データ件数が100程度以下であれば挿入ソートを使うのですが、後者のバブルソートの1回目のスキャンだけをやって、最小値を先頭にもってくることで安定な挿入ソートの番兵としています。

  • weavaest
  • ベストアンサー率15% (157/1020)
回答No.5

前者です。 バブルソートの名前のことは、なんか意味があるんだろうな程度の認識です。

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

バブルソートに限りませんが、特別な理由がない限りは先頭から順に処理をするものだと思います。また、「バブルソート」という名称を考えてから処理内容を考えたということもまずありえないでしょうから、「バブルのイメージに合うのは前からか後ろからか」という考え方のアプローチ方法がナンセンスに感じます。 「泡がだんだん大きくなっていくイメージ」で実装しなければならないというルールとなると、降順の場合は末尾から処理をすることになるのでしょうか?あるいは降順の場合はバブルソートとは呼べないのでしょうか?私にとってはそれもおかしく、昇順だろうと降順だろうと先頭から処理をすべきだと思います。 どうしてもイメージにこだわるのなら…、水面は基準ですから配列で言うと0番目に相当し、湖によって深さは異なるので湖底が配列の末尾に該当すると思います。ですので、「湖底から水面へ」を表現するなら、むしろ配列の末尾から処理をするのが妥当に思えてしまいます。なのでその逆になる考えが、湖と配列をどのように対応させてイメージしているのかむしろ気になります。

回答No.3

どちらをイメージするかというと、私も前者をイメージしますが、 「バブル」という言葉をどうイメージするかというだけの話であり、 どちらでも本質的な違いはないと思います。 なので、前者の方法を説明した後、わざわざ後者の方法まで説明しません。 他のソート方式でも、処理方法は異なるが本質的な考え方は同じ方式である と言えるものはいくつもあり、それをいちいち説明していたらきりがないし、 プログラミング初心者にたくさんの処理方法を説明するのは 余計な混乱を招く可能性もあると思います。

noname#212058
noname#212058
回答No.2

私は「大きい数字を後ろに持っていく」パターンで話をしますね。イメージとしては質問者さんと同じで「湖底から水面へ泡が上がっていくイメージ」なのですが、私が「大きい値」側を湖面としているのは「高さ(標高)」のイメージがあるからです。 質問者さんの「泡がだんだん大きくなっていく」イメージは、「泡として移動していく値」がだんだん大きくなっていくような、余計なイメージが浮かぶので、良くないように思います。

回答No.1

ソートのロジックは他にも数種類あります。 それぞれスピードが違うわけですが、考えるまでもなく速いものがいいです。 でもそれは、コンピュータの性能が悪かった時代の考えです。 今のパソコンならどれでやっても気になるような時間ではありません。 腰を抜かすような件数を対象とするなら別ですが。

e2131adfi
質問者

お礼

回答ありがとうございます。 えーと、今回の質問の意図は、バブルソートのアルゴリズムで 「前から後ろに持っていく派」か、「後ろから前に持っていく派」かを 問うているのですが、いかがでしょうか。 なお、走査が前後逆なだけですのでこれによる速度の違いは無く、 あくまで好みの問題かと思っていますが・・・。 高速なソートのロジックが他にもあるのは承知の上です。 文中にもあるように、「他人に教えることを想像したとき」に どちらのスタンスで説明するかを知りたいです。 プログラミングを全く知らない人を相手に教えるときのことを 想定して頂ければと思います。

関連するQ&A

  • バブルソートを入れたいのですが

    こんにちは、Perlを始めたばかりの初心者です。 さっそく質問の方失礼します。 乱数1~100までの数字のうち20個をとりだし配列にいれ、数字を昇順に入れ替えして昇順前と昇順後の数字を表示する問題なのですが。 @a[100]=(1..100); srand(time()); for($i=0 ; $i<20 ; $i++){ $a=int(rand(@a)); print"$a\n"; } と上記の乱数20個を取り出すことができたのですが、 そのあとの昇順させようとしてバブルソートを利用したいのですが、どのように組み込めばいいかわかりません。 どのように組み込めばいいのでしょうか? お答えの方ヨロシクお願いします。

    • ベストアンサー
    • Perl
  • バブル・ソート、クイック・ソート

    N個(N=4,5,6)のデータが全て等しいデータ列(例えばN個の数字全部が1のとき)をバブルソートで並び替えたとき、データの交換回数は何回か。また、同じデータ列をクイックソートで並び替えたときはどうか。 という問題があるのですが、どう比較するのかがわかりません。詳しい方、説明よろしくお願いします。

  • C#でバブルソート

    テキストボックスに任意の整数を複数個入力し、ボタンを押すことで入力した数字を別のテキストボックスに昇順・降順表示するプログラムを作りたいと思っています。 例えば 入力用テキストボックスに1、10、5をキーボードで入力 ↓ 作っておいた「昇順に並び替え」のボタンをクリック ↓ 出力用テキストボックスに1、5、10と表示される (「降順に並び替え」のボタンをクリックした場合は、10、5、1と表示) といった感じです。 バブルソートを使って作りたいのですが、超初心者のため、数字同士の比較?や、テキストボックスへの出力の仕方が全く分かりません。 分かりにくい文章のみの状況説明になってしまいましたが、ご指導よろしくお願いします。 マイクロソフトのビジュアルのC#プロジェクトです。

  • バブルソートの実行時間について

    バブルソートで降順、ランダム順に並んでいるデータを読み込ませて昇順に並び替える実行時間について質問です。 バブルソートにおける計算時間は、データ数が多いほど、並び替える回数が多いほど長くなるはずですが、実際に実行したところ、並び替える回数が多いはずの降順のほうがランダム順よりも早くなりました。 なぜこのようになるのですか? よろしくお願いします。

  • バブルソート

    int a[] = {8,45,15,90,62,73,22}をバブルソートを使用して、降順で並べ替える。 以下の説明では、配列の要素数(ここでは7)をNとしている。 (1) a[N-1] と a[N-2] を比較し、a[N-1] が a[N-2] より大きい場合は、a[N-1] と a[N-2] を入れ替える。   同様に a[ j] が a[ j-1] より大きければ、a[ j] と a[ j-1] を入れ替える。   この操作を、j=N-1からiまで繰り返す。ただし、iは(1)の処理回数を表す値である。(初回を0とする) (2) (1)を i=0 から N-2 まで繰り返す。 (3) 以下の<実行例>を参考に、配列aのようその各値を標準出力する。 <実行例> 90 73 62 45 22 15 8 という問題なのですが、どうやってもうまく並び替えられません。 a[N-1] の処理はいらないのではないのですか? どのようにプログラムを書いたらいいのか教えて下さい。 あつかましいですが、できたら解説付きでお願いします。

    • ベストアンサー
    • Java
  • アルファベットのソート

    Javaでクイックソートを使って、アルファベットを昇順に(スペースより小文字の方が大きい、小文字より大文字のほうが大きいものとする)並べ替えたいのですが、比較方法がよくわかりません。ご教授お願いいたします。 入力は、キーボードからの入力でchar型配列です。

    • ベストアンサー
    • Java
  • ソートアルゴリズム(選択法とバブルソート)の交換回数

    バブルソートと選択法について、交換回数がわかりません。 比較回数については、ネットで検索したり、本に載っているので分かりやすいのですが、交換回数があまり載っていなく…。 選択法の交換回数の最大値は、n-1でしょうか? バブルソートの交換回数の最大値は、nでしょうか? 交換回数については、選択法のほうがバブルソートより少なくてすむそうですが、上の答えでいいのかわかりません。 どなたか教えてください。お願いしますm(_ _)m

  • ソートで

    get().sort(function() { return Math.round(Math.random()) - 0.5; }) はどういう意味ですか? ソートを return Math.round(Math.random()) - 0.5; でするようですが、 ランダムな数字を出してどうやってソートされるのですか? ソートは文字でか数値ででないのですか? http://memopad.bitter.jp/w3c/jsref/jsref_sort.html では >フォルトで、要素をアルファベットの昇順にソートします。 しかし、数値が正しくソートされません(40が5の前に来ます)。 数値をソートするためには、数を比較する関数を追加しなければなりません。 となっています。 ランダムな数字でソートはできるのですか? 使う意味を教えて下さい。 それから、-0.5をしてるのはどういう意味でしょうか?

  • 配列のソートがしたい

    sort関数等調べたのですがうまくできません。 やりたいことは http://q.hatena.ne.jp/1155090363 ↑で見つけた事とそっくりなのですが・・・。 ------------------------------------------- arrItem[n] という配列の一つの要素の中に、 タブで区切られた10個程のデータが入っています。 arrItem[0] = "5 ^ 店名5 ^ 品名5 ^ 価格5 ^ 割引額5 ^・・・^ 備考5" arrItem[1] = "2 ^ 店名2 ^ 品名2 ^ 価格2 ^ 割引額2 ^・・・^ 備考2" arrItem[2] = "11 ^ 店名9 ^ 品名9 ^ 価格9 ^ 割引額9 ^・・・^ 備考9" 一列目はSEQ番号でユニークですが、順番が並んでいません。 この配列をSEQ番号で並べ替えたいのですが、 sortだと文字列比較のためか桁数の違う数字の並べ替えが 上手くできません。数値としてのソート方法 が分かる方いらっしゃいましたらご教授願います。 もし可能なら、1列目を数値降順にしたり昇順にしたり、 また2列目を五十音順にソートしたり、 また4列目を価格の安い順にソートしたり と応用も可能ならばご教授願いたいです。 宜しくお願い致します。

  • qsort/クイックソートについて

    構造体の配列をqsortで昇順に並び替えるプログラムを作成しています。 対象は数値項目で、単純にNo順に並び替えるイメージです。 クイックソートは、配列の内容によって処理時間が変わると聞いたので、一番遅くなる場合の時間を調べたいのですが、どのような並びだと一番遅くなるのでしょうか?

専門家に質問してみよう