• ベストアンサー

シェルソートとヒープソート

シェルソートとヒープソートの意味が分かりません。 他の有名なソートの考え方は分かりました。 考え方についての画像や動画があって、考え方について 説明されているサイトを紹介してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.5

ymmasayanです。補足します。 >5→2→1より5→3→2→1が時間はかかっているというのもたぶん予想ですよね? >5→2→1より5→3→2→1が速いということも考えられますよね。 その通りです。失礼しました。 >そのサイトでは約半分ずつにしていたけど、この数値をどのように変化させていくかが >シェルソートの高速化の重要な部分だと思いました。 その通りです。一応2分木やクイックソートと同じように2分割ずつにするのが 早いといわれています。 余談になりますが理論的には2進法の計算機よりも2.7進法の計算機が最も効率が良く、 クイックソートや二分木も2.7(=e:自然対数の底)を使うともっと効率が よくなるそうです。(実際には不可能ですが) シェルソートもそうなのかも知れません。

Slihpon
質問者

お礼

ありがとうごさいました。 ソートのアルゴリズムは置くが深くて面白そうですね。 少しずつ理解を深めていきたいです。

その他の回答 (4)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

No.2、No.3のymmasayanです。補足にお答えします。 まず最初にいくつかお断りしておきますが、 (1)シェルソートは数あるソートの中でも、理解するのが最も難しい部類のソートです。   専門家の中でもきちんと理解していない人がいるくらいです。 (2)シェルソートは最初から最後まで、挿入ソートをしています。 5・3・2・1でやる場合5組の挿入ソートを同時並行で行い、 次にグループを組替えて3組の挿入ソートを同時並行的に行い、 次に2組、最後に1組で総仕上げを行います。 ここのところは言葉で説明してもなかなかわかりません。 挿入ソートに見えず隣接交換の変形に見えてしまうのです。 (3)シェルソートは原理的にも、又実際上も早いことはわかっています。 しかし本当にどれだけ速いのか研究され尽くしていません。 それではお答えです。 >僕はまだ終了直前までは適当に思えしてまいます。 >ソートの完成は全てが最後の挿入ソートに任されていて、 >それまでの処理は適当なソートだとしか思えません。 最後のソートが歯止めになっていることは間違いありません。 しかし途中のソートががんばってスピードを稼いでいるのです。 つまり遠く離れた数値を交換しておくことによって、最後のソートが 何回も1個ずつデータ移動しなくても済むようにしています。 適当に見えるのは、グループの合体やグループの組みなおしをしたときに 整列がくずれるのでそう見えるのだと思います。 >もし、最後のループ処理が >while ( ... ) { > 2つを比較し、右が大きければ交換し、そうでないなら>何もしない; > ポインタを2つすすめる; >} >で済むなら、それまでのソートは質のいいものだと思い>ます。 何度もいうように前の方のソートには粗く大きく入れ替えて最後にスピードが 上がるようにするという使命があります。 もし前できちんと並べてしまったら計算量がn^2型になって意味がありません。 >5→2→1より5→3→2→1が、見た感じが完成に近いです。 >それは、適当なソートを行った回数が多いからだと思うので、 >見た感じが完成に近いというのは予想できたことでした。 その代わり時間はかかっているはずです。 >シェルは、挿入よりもかなり速かったです。 >速くなるというのが予想できなかったのが悔しいです。 途中で書きましたが大きく飛ばしておいてあとできちんと整列することで スピードと正確さを保っているのです。 >もしかして、適当にソートと書いたのが、ランダムに並べ直すに見えましたか? いえ、そんなことは有りません。適当に見えるのは2つ理由があって 遠くへ放り投げるのと、グループの組みなおし(統合)の判りにくさでしょう。

Slihpon
質問者

お礼

5→2→1より5→3→2→1が時間はかかっているというのもたぶん予想ですよね? 僕も5→2→1の方が速そうに思えますが、1より5→2→1が速いことから 5→2→1より5→3→2→1が速いということも考えられますよね。 そのサイトでは約半分ずつにしていたけど、この数値をどのように変化させていくかが シェルソートの高速化の重要な部分だと思いました。 ヒープソートの木について少し分かってきました。 ありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

No.2のymmasayanです。補足します。 >シェルは、途中まで適当に並べて、最後のところで挿入ソートで正確に並べるんですね。 >その最後の部分までは本当に適当でいいみたいですね。 適当という風に見えましたか。それは例が悪かったのですね。 データが16個だときれいに行くのですが。 8→4→2→1という風にグループの数が減っていきます。 それぞれのグループの中でそれぞれ同時並行的に挿入ソートをやっています。 ここがなかなか判りにくいところです。じっくり考えてみてください。 決して適当にやっているわけではありません。 >参考サイトで、なぜ5/2が3でなく2を採用したのか分からなかったけど、 5/2の件ですが、5→3→2→1という系列と 5→2→1という系列の2つが考えられますが、 本当はどちらでもいいのです。 ここでは効率のよさを考えて2を使ったのだと思います。 >最後のソートが全てきちんとやってくれているんだと分かりました。 これは違います。確かに前でどんなことが有っても最後のソートできちんとしてくれます。 でもソートのスピードという点を考えると前の方も適当では困るのです。 実際に前の方もまじめに挿入ソートをやっています。 次にヒープソートです。木になれていないと少しとっつきにくいでしょう。 参考URLがわかりにくかったですね。 http://www.heppoko-online.com/it/kiso.html に変えましょう。 まずヒープを作る話です。上ほど小さい数字になるように並べます。 生年月日の若い人が上にくるようなものです。 次にソートです。 全部並べ終わると一番上を抜きます。すると出世競争が起こって ヒープの並べ替えが起こります。 落ち着くと又一番上を抜きます。これを繰り返すと小さい順にデータが取り出せます。 つまり整列です。これがヒープソートです。 実際のヒープソートはやり方が少し違いますが、基本原理だけしっかり理解してください。

Slihpon
質問者

お礼

ありがとうございます。 http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/SSort.htm について、僕はまだ終了直前までは適当に思えしてまいます。 5→3→2→1と5→2→1が考えられます。 実際に、そのサイトのサンプル値でやりました。 5→2→1 [20] (88) [32] (62) [18] (12) [15] (30) [52] (8)【2-処理前】 [52] (88) [32] (62) [20] (30) [18] (12) [15] (8)【2-処理後】 5→3→2→1 [20] (88) {32} [62] (18) {12} [15] (30) {52} [8]【3-処理前】 [62] (88) {52} [20] (30) {32} [15] (18) {12} [8]【3-処理後】 [62] (88) [52] (20) [30] (32) [15] (18) [12] (8)【2-処理前】 [62] (88) [52] (62) [30] (30) [15] (12) [12] (8)【2-処理後】 どっちの方法でも、この後、挿入ソートによってどんな並びであっても 完成することができます。 その最後の挿入ソートをする直前の値は、上に書いたように 5/2で、3を適用した場合と2を適用した場合で異なっています。 そのことから、ソートの完成は全てが最後の挿入ソートに任されていて、 それまでの処理は適当なソートだとしか思えません。 もし、最後のループ処理が while ( ... ) {  2つを比較し、右が大きければ交換し、そうでないなら何もしない;  ポインタを2つすすめる; } で済むなら、それまでのソートは質のいいものだと思います。 5→2→1より5→3→2→1が、見た感じが完成に近いです。 それは、適当なソートを行った回数が多いからだと思うので、 見た感じが完成に近いというのは予想できたことでした。 シェルは、挿入よりもかなり速かったです。 シェルのまばらな2値の抽出は、既にソートされた配列への対策だけ のように見えるんだけど、速くなるというのが予想できなかったのが 悔しいです。 もしかして、適当にソートと書いたのが、ランダムに並べ直すに見えましたか?

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

シェルソート・・隣接交換法の改良版と思われ勝ちですが、実は基本挿入法の改良版です。 http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/SSort.htm ヒープソート・・ヒープは2分木ですが関係付けにポインターが要りません。 したがって配列で表すことが出来ます。高速のソートです。 http://www.heppoko-online.com/it/kiso.html

Slihpon
質問者

お礼

シェルのシステムを初めて知ることができました。 ありがとうございました。 シェルは、途中まで適当に並べて、最後のところで挿入ートで正確に並べるんですね。 その最後の部分までは本当に適当でいいみたいですね。 参考サイトで、なぜ5/2が3でなく2を採用したのか分からなかったけど、 最後のソートが全てきちんとやってくれているんだと分かりました。 下の参考サイトは画像はあったけど、文章が理解できませんでした。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

参考URL何かどうですか?

参考URL:
http://www.inet-lab.org/ted/program/progcontents04.html
Slihpon
質問者

お礼

ありがとうございました。 木を知らなかったので役立ちました。

関連するQ&A

  • シェルソートの順位性

     このカテゴリーのNo.137(#35189)の続きなのですが、シェルソートについてご存知の方お願いします。  上記の質問にて、ヒープソートは完全二分割木型で、同一の値であってもその順序は保証されない、ということがわかりました。  そこで、配列の内容をソートする処理をシェルソートで組んでみました。  やろうとしているのは、n1、n2 の2つの配列に値を入れ、n1 が同じ値だったら n2 の値を使ってソートする、という処理です。  しかし実際には、n3、n4と無制限に続く2次元配列なので各配列を個別にソートしなければならず、n2 を先にソートしてから n1 をソートする、という処理を入れています。  ところがこれだと、n1 のソート時に同一の値の順序が崩れると、せっかく行った n2 のソートが無駄になってしまいます。  シェルソートの場合、こういうことは起こるのでしょうか。  よろしくお願いします。 

  • ソート(データの並べ替え)の逆概念はシャッフル?

    ソートは、データの集合を一定の規則に従って並べること。 バブルソート、シェーカーソート、コムソート、選択ソート、 挿入ソート、シェルソート、ヒープソート、マージソート、 クイックソート、バケットソート、基数ソート、 逆写像ソート、ボゴソート、奇偶転置ソート、シェアソート などがあるそうです。 ではその逆概念の、データの集合を一定の規則に従ってバラバラにすることってなんといいますか? トランプ(カードマジック)でよく見かけるシャッフルのことでしょうか? ディールシャッフル、ヒンズーシャッフル、オーバーハンドシャッフル、リフルシャッフル、ファローシャッフル などがあるそうです。 それらを数学的に扱ったものってありますか?

  • シェルでmysqlの操作

    新しいサーバーの mysqlを操作するために、シェルで 行わねばならなくなりました。 シェルで操作といっても どこからどう操作すればよいのか、ほとほと困っています。 色々なサイトをチェックしたんですが どれもイマイチわかりづらくて… そもそもシェルがよくわかっていません。 わかりやすくご教授していただける サイトなど紹介してもらえませんでしょうか?

  • Qソートについて教えて下さい

    幼児の愛着を調べるQソート法についてご存知でしょうか? 書籍を検索してもなかなかヒットしませんし、過去の論文等を調べても、詳しいやり方(対象年齢等を含む)まで含んでかかれているものが見つかりません。 ぜひ概略、もしくは説明が載っているという書籍、論文等があれば教えて下さい。 また他に幼児の愛着を測定する方法があればご紹介ください。(質問紙、実験法、観察法どれでも構いません) Qソートのほかには有名なストレンジシュチュレーションくらいしか私には思い浮かびません。。。。できたら幼児を対象にと考えているので、ストレンジシュチュレーションでは無理がありますよね。

  • データの日付でソートをしたい

    データの日付でソートをしたい データの日付でソートをしたいと思ってますが、うまくいっていません。 $kuchikm2の内容 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, ソートした結果@sorted 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, (perlソース) 略 #sortロジック use warnings; my @lines = $kuchikm2; print @lines, " a\n"; my @sorted = map { $_->[4] } sort { $a->[0] <=> $b->[0]} map { [(split q{,}, $_)[4], $_] } @lines; print @sorted, " b\n"; (ここまで) 以前ソートで質問したときに、数字でないといけないと言われたような気がしています。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • shシェルのサイト

    shシェルを使う必要がでました。 マニュアルのサイトを紹介して下さい。 必須条件は「日本語である事」です。 できれば公式リファレンスが参照できるようなサイトがあれば嬉しいです。 それとは別にHow to的なサイトでお勧めがあれば紹介して下さい。 よろしくお願いします。

  • Cシェルのマニュアルサイトを紹介してください

    Cシェルのリファレンスマニュアルのサイト紹介してください お願いします。

  • 比較回数が少なくなるソート

    大量にある画像に人間が優劣を判定し、その結果をソートしたいです。(順位を付けたい) 画像はすでにデジタルデータ化されてパソコンの中にあります。 二つの画像を人間に見せて判断を求める事を繰り返すプログラムを作成しようと思うのですが、人間が行う操作(比較の判断)をなるべく少なくする為には、どのようなソートのアルゴリズムを選択したら良いでしょうか? ソートのアルゴリズムの説明などを読むと、例えば、「バブルソート」及び「選択ソート」ではn(n-1)/2の比較が必要になるそうですが、この比較の回数が最も少ない方法を探しています。 また、例えばA,B,Cの比較に置いて、 A>B、B>Cの比較後にはAとCは比較せずともA>Cの関係が成り立つのですが、こういった事も考慮した上での比較回数の最も少ないソートの方法が知りたいです。 以上、ご指導のほど、よろしくお願い申し上げます。

  • Depart USPS Sort 意味は?

    アメリカの通販で商品を購入したのですが USPSのサイトで表示されている意味がなんとなくしか分かりません。 1、Processed through USPS Sort Facility 2、Depart USPS Sort Facility 1と2の意味を教えて下さい。

  • シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2

    シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2...のような位置パラメタや、$?,$$,$!,$-のような特殊変数がありますが、これはPerlやRubyもあるようですが、意味や効果、やり方等は同じでしょうか。 当方はPHP,JavaScriptしか触れていませんし、PHPやJavaScriptは、そのような位置パラメタや特殊変数は見当たりませんでした…。 つまり、PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか。 こういった位置パラメタや特殊変数はPerlやRuby以外に他の言語にもありますでしょうか。PythonとかCとかJavaとか…。 また、Bシェルを学んでいる途中ですが、シェルスクリプトの中にはbourne以外にもbashやC Shell,zsh,Perlがありますが、何故Perlが入っているのでしょうか。 Perlをやっている方は別途シェルスクリプトをやる必要はないということでしょうか。

専門家に質問してみよう